LocalBroadcastManager与IntentService的简单使用

我们在使用BroadcastManager的时候,会分为隐式和显式两种广播。他们各有各的用处,但是在使用隐式广播的时候,会因为其覆盖的面比较大,会因为一些原因被其它应用程序所得到我们的广播内容。LocalBroadcastManager是一个只在本应用内使用的BroadcastManager。它的代码很少只有300多行,想了解细节的朋友可以去看一下源代码。
IntentService是Service的一个子类,可以看做是Service和HandlerThread的结合体,在完成了使命之后会自动停止,适合需要在工作线程处理UI无关任务的场景。
IntentService有以下三个特点:
1、IntentService 是继承自 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作。
2、当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。
3、如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,使用串行的方式,执行完自动结束。
下面我们通过一个例子来看一下,它们的使用
activity_main.xml

package com.cg.intentservcelearn;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import com.cg.intentservcelearn.services.MyIntentService;
import com.cg.intentservcelearn.services.MyService;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_1;
    private Button btn_2;
    private Button btn_3;
    private SeekBar seekbar1;
    private SeekBar seekbar2;

    private LocalBroadcastManager localBroadcastManager;
    private MyBroadcastReceiver mBroadcastReceiver;
    public final static String ACTION_TYPE_THREAD = "action.type.thread";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initControls();


        //注册广播
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        mBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_TYPE_THREAD);
        localBroadcastManager.registerReceiver(mBroadcastReceiver,filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
    }

    /**
     * 初始化控件
     */
    private void initControls() {
        btn_1 = (Button)findViewById(R.id.btn_1);
        btn_1.setOnClickListener(this);
        btn_2 = (Button)findViewById(R.id.btn_2);
        btn_2.setOnClickListener(this);
        btn_3 = (Button)findViewById(R.id.btn_3);
        btn_3.setOnClickListener(this);

        seekbar1 = (SeekBar)findViewById(R.id.seekbar1);
        seekbar2 = (SeekBar)findViewById(R.id.seekbar2);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.btn_1:
                Intent intent = new Intent(MainActivity.this, MyService.class);
                intent.putExtra("type",1);
                startService(intent);
                break;
            case R.id.btn_2:
                Intent intent2 = new Intent(MainActivity.this, MyService.class);
                intent2.putExtra("type",2);
                startService(intent2);
                break;
            case R.id.btn_3:

                break;
        }
    }

    public class MyBroadcastReceiver extends BroadcastReceiver
    {

        @Override
        public void onReceive(Context context, Intent intent) {

            switch (intent.getAction()) {
                case ACTION_TYPE_THREAD:
                    //更改ui
                    int progress = intent.getIntExtra("progress", 0);
                    int mType = intent.getIntExtra("type",0);
                    if(mType==1)
                    {
                        seekbar1.setProgress(progress);
                    }else if(mType==2){
                        seekbar2.setProgress(progress);
                    }else{

                    }
                    break;
            }
        }
    }
}

MainActivity.java

package com.cg.intentservcelearn;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import com.cg.intentservcelearn.services.MyIntentService;
import com.cg.intentservcelearn.services.MyService;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_1;
    private Button btn_2;
    private SeekBar seekbar1;
    private SeekBar seekbar2;

    private LocalBroadcastManager localBroadcastManager;
    private MyBroadcastReceiver mBroadcastReceiver;
    public final static String ACTION_TYPE_THREAD = "action.type.thread";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initControls();


        //注册广播
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        mBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_TYPE_THREAD);
        localBroadcastManager.registerReceiver(mBroadcastReceiver,filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
    }

    /**
     * 初始化控件
     */
    private void initControls() {
        btn_1 = (Button)findViewById(R.id.btn_1);
        btn_1.setOnClickListener(this);
        btn_2 = (Button)findViewById(R.id.btn_2);
        btn_2.setOnClickListener(this);

        seekbar1 = (SeekBar)findViewById(R.id.seekbar1);
        seekbar2 = (SeekBar)findViewById(R.id.seekbar2);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.btn_1:
                Intent intent = new Intent(MainActivity.this, MyService.class);
                intent.putExtra("type",1);
                startService(intent);
                break;
            case R.id.btn_2:
                Intent intent2 = new Intent(MainActivity.this, MyService.class);
                intent2.putExtra("type",2);
                startService(intent2);
                break;
        }
    }

    public class MyBroadcastReceiver extends BroadcastReceiver
    {

        @Override
        public void onReceive(Context context, Intent intent) {

            switch (intent.getAction()) {
                case ACTION_TYPE_THREAD:
                    //更改ui
                    int progress = intent.getIntExtra("progress", 0);
                    int mType = intent.getIntExtra("type",0);
                    if(mType==1)
                    {
                        seekbar1.setProgress(progress);
                    }else if(mType==2){
                        seekbar2.setProgress(progress);
                    }else{

                    }
                    break;
            }
        }
    }
}

MyIntentService.java

package com.cg.intentservcelearn.services;

import android.app.IntentService;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;

import com.cg.intentservcelearn.MainActivity;

public class MyIntentService extends IntentService {

    /**
     * 是否正在运行
     */
    private boolean isRunning;

    /**
     *进度
     */
    private int count;

    /**
     * 广播
     */
    private LocalBroadcastManager mLocalBroadcastManager;


    public MyIntentService() {
        super("MyIntentService");
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        int mType = intent.getIntExtra("type",0);

        try {
            Thread.sleep(1000);
            isRunning = true;
            count = 0;
            while (isRunning) {
                count++;
                if (count >= 100) {
                    isRunning = false;
                }
                Thread.sleep(50);
                sendThreadStatus(count, mType);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送进度消息
     */
    private void sendThreadStatus(int progress,int type) {
        Intent intent = new Intent(MainActivity.ACTION_TYPE_THREAD);
        intent.putExtra("progress", progress);
        intent.putExtra("type",type);
        mLocalBroadcastManager.sendBroadcast(intent);
    }
}

在AndroidManifest.xml文件中注册这个servies

好了,运行一下,看一下效果吧。这里我就不加图了。
你点第一个按钮之后,在进度条,没有头的时候,再点第二个,会看到什么。。。。。会看到intentService的一个特性。运行一下看一下吧

发布了305 篇原创文章 · 获赞 261 · 访问量 184万+

猜你喜欢

转载自blog.csdn.net/chenguang79/article/details/99306244