一,通过startService(Intent service)启动服务
只能通过广播实现通信
二,通过bindService(Intent service,ServiceConnection conn,int flags)启动服务
第一个参数如果只是调用setAction(String action)方法实现隐式的Intent调用Service会出现Implicit intents with startService are not safe错误,这是引文从Lollipop开始,service服务必须采用显示方式启动。
Android源码
改进方法:
1) 直接在Intent中指定要启动的Service
Intent intent = new Intent(xxx.this,xxx.class);
bindService(intent,ServiceConnection,flags);
2) 设置Action和PackageName
Intent intent = new Intent();
intent.setAction("xxx.xxx.xxx");
intent.setPackage(getPackageName());
bindService(intent,ServiceConnection,flags);
在调用bindService的Activity中实现定义ServiceConnection,并实现其中的方法
public void onServiceConnected(ComponentName name,IBinder service);//强转成自己实现的Binder对象,即可实现通信
public void onServiceDisconnected(ComponentName name);
在Service类中定义内部类实现Binder,在onBind回调方法中将Binder的实例返回。
实例:
public class MyService extends Service { private int count = 110; private String TAG = "Service"; private MyBinder binder = new MyBinder(); public class MyBinder extends Binder { public int getCount(){ return count; } } public MyService() { } @Override public void onCreate() { super.onCreate(); Log.e(TAG,"onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG,"onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.e(TAG,"onDestroy"); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { Log.e(TAG,"onUnbind"); return super.onUnbind(intent); } @Override public IBinder onBind(Intent intent) { Log.e(TAG,"onBind"); return binder; } }
public class MainActivity extends Activity{ private Button bind,unbind; private MyService.MyBinder binder; ServiceConnection connectionn = new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.e(TAG,"onServiceConnected"); binder = (MyService.MyBinder)service; Log.e(TAG,binder.getCount() + ""); } @Override public void onServiceDisconnected(ComponentName name) { Log.e(TAG,"onServiceDisconnected is called"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bind= (Button)findViewById(R.id.bind); bind.setOnClickListener(new View.OnClickListener(){@Override public void onClick(View v) {Intent intent = new Intent(MainActivity.this,MyService.class);}bindService(intent, connectionn, Service.BIND_AUTO_CREATE);});unbind= (Button)findViewById(R.id.unbind); unbind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {unbindService(connectionn);} }); }}