Activity、Service、BroadCastReceiver之间的通信

在主界面上,启动后台服务Service,后台处理数据,前台通过BroadcastReceiver获得数据并更新UI。
在Service中通过启动广播将数据发送到Activity中

步骤:
a:创建服务,写一个类继承IntentService,实现重写的onHandlerIntent(Intent intent)方法,并在清单文件中注册service在此方法中执行耗时操作
b:在service中执行完操作后,通过Intent发送广播  (设置action,发送广播)
    //设置广播的action
   Intent intent1 = new Intent("com.sendValue.value");
        intent1.putExtra("value",value);
        sendBroadcast(intent1);
c:  在Activity中通过Intent开启服务
        //开启服务
        Intent intent = new Intent(MainActivity.this, LoadService.class);
        startService(intent);
d:在Activity中动态注册广播(注意action要和service中发送过来的action一致),在onReceive()方法里面接收到值
        通过写一个内部类继承BroadcastReceiver实现onReceive(Context context, Intent intent)方法,来动态注册广播
        //动态注册广播
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.sendValue.value");
        //注册广播
        registerReceiver(myBroadCast, intentFilter);
     获得service通过广播发送过来的数据,进行UI更新    
class MyBroadCast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //接收到动态的值
        int data = intent.getIntExtra("value",1);
            textView.setText(""+data);
        }
    }
    e:在onDestroy()方法中解除广播的注册
         @Override
            protected void onDestroy() {
                super.onDestroy();
                unregisterReceiver(myBroadCast);
            }
Demo:

Activity中   
/**
 * 案例:服务里面一直执行下载操作然后需要把下载的值传回activity中
* 步骤:
* 1.创建服务并且实现逻辑
* 2.在服务执行逻辑的时候将值传到广播上
* 3.在activity里动态注册广播,在onReceive()方法里面接收到值
*/
public class MainActivity extends AppCompatActivity {

    private TextView textView;

    private MyBroadCast myBroadCast;
    private IntentFilter intentFilter;

    private LoadService loadService;

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

        textView = (TextView) findViewById(R.id.text);

        myBroadCast = new MyBroadCast();
        loadService = new LoadService();
        //开启服务
        Intent intent = new Intent(MainActivity.this, LoadService.class);
        startService(intent);

        //动态注册广播
        intentFilter = new IntentFilter();                          intentFilter.addAction("com.sendValue.value");
        //注册广播
        registerReceiver(myBroadCast, intentFilter);
    }

//广播的内部类
class MyBroadCast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //接收到动态的值
        int data = intent.getIntExtra("value",1);
            textView.setText(""+data);
        }
    }

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

Service中:
/**
 * Created by niutingting on 2016/2/19 0019.
 */
public class LoadService extends IntentService {
    //模拟下载进度的值
    int value = 0;
    /**
    * Creates an IntentService.  Invoked by your subclass's constructor.
     */
    public LoadService() {
        super("name");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        //网络逻辑在这里执行
        while (true) {
            try {
                Thread.sleep(1000);
                value++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        //设置广播的action
        Intent intent1 = new Intent("com.sendValue.value");
            intent1.putExtra("value",value);
            sendBroadcast(intent1);
        }
    }
}

AndroidManifest.xml清单文件中:
            ".LoadService"/>

你可能感兴趣的:(Android)