之前的笔记中有 通过绑定的方式 来调用服务中的方法,那么接下来就来介绍另一种常见的方式来达到同样的效果
这就是通过 Broadcast 来调用 Service
这种方式除了能达到跟绑定的方式一眼的效果外,还能实现一些特殊的方式。
比如一些开机自启的服务的启动就可以通过用broadcast来开启Service。
只要在broadcast中设置 intentfilter 的action 为 BOOT_COMPLETED;即可监听到 设备的开机 从而调用一些方法。
接下来就通过一个简单案例来看一下 通过 broadcast调用Service中方法的实现过程
这个案例中有一个activity 一个Service activity负责发送广播,Service接收到广播 然后调用方法
package com.itheima.callmethod;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,MyService.class);
startService(intent);
}
@Override
protected void onDestroy() {
Intent intent = new Intent(this,MyService.class);
stopService(intent);
super.onDestroy();
}
public void click(View view){
//发送广播
Intent intent = new Intent();// <<<<<<<------
intent.setAction("com.itheima.callmethod");
sendBroadcast(intent);
}
}
package com.itheima.callmethod;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.text.BoringLayout;
import android.widget.Toast;
public class MyService extends Service{
private Receiver receiver;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// 通过代码注册广播接收者
IntentFilter filter = new IntentFilter();
filter.addAction("com.itheima.callmethod");
receiver = new Receiver();
registerReceiver(receiver, filter );
super.onCreate();
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
receiver = null;
super.onDestroy();
}
private void innerMethod() {
Toast.makeText(this, "我是服务里边的内部方法", 0).show();
}
private class Receiver extends BroadcastReceiver{
//接收到广播之后 开始调用服务里面的方法
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("com.itheima.callmethod".equals(action)){
innerMethod();
}
}
}
}