5.0以上隐式开启service会出现Service Intent must be explicit异常
解决办法不仅要设置action,还要设置package
隐式创建:
1.首先创建一个继承service的类
public class PayService extends Service {
@Override
public void onCreate() {
super.onCreate();
System.out.println("onCreate启动");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
System.out.println("onBind启动");
return new MyBind();
}
public class MyBind extends Binder{
public void payMethod(){
methodInService();
}
}
public void methodInService(){
System.out.println("支付开始");
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onUnbind启动");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("onDestroy启动");
}
}
在清单文件中注册
<service android:name=".PayService">
<intent-filter>
<action android:name="com.demo.alipay"/>
</intent-filter>
</service>
在mainActivity中启动
public class MainActivity extends AppCompatActivity {
private Intent intent;
private PayService.MyBind myBind;
private MyConn myConn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent();
intent.setAction("com.demo.alipay");
intent.setPackage("com.demo.bindservice");
}
@Override
protected void onResume() {
super.onResume();
if(myConn==null)
myConn=new MyConn();
bindService(intent,myConn,BIND_AUTO_CREATE);
}
private class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("myconn启动");
myBind = (PayService.MyBind) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(myConn);
}
执行结果
触发支付在点击事件里
public void clicks(View view){
myBind.payMethod();
}
以上就是隐式启动service以及调用service里方法
BindService另一个作用就是进程间通讯
在android studio 创建 aidl文件
首先在android studio中创建一个aidl可以直接new一个aidl
然后会在app同级目录下创建aidl文件夹
如果手动创建aidl文件 也请移动aidl文件夹以及包名为项目package名下。然后rebuild一下 就可以看到
然后之前的PayService中MyBind继承IService.Stub
public class MyBind extends IService.Stub{
@Override
public void callMethodInService() throws RemoteException {
methodInService();
}
}