下面是我的控制台报错结果:
2019-12-14 20:06:42.501 13509-13509/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 13509
java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.myapplication.Music }
at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1519)
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1560)
at android.app.ContextImpl.startService(ContextImpl.java:1532)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at com.example.myapplication.MainActivity$1.onClick(MainActivity.java:36)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
1、经过查阅资料,我知道了我的错误原因:有些时候我们使用Service的时须要采用隐私启动的方式,可是Android 5.0一出来后。当中有个特性就是Service Intent must be explitict,也就是说从Android Lollipop版本号(Android 5.0)开始。service服务必须采用显示方式启动。
2、解决方案:第一种方式:用显式意图替换隐式意图。
Intent mIntent = new Intent();
mIntent.setAction("XXX.XXX.XXX");
Intent intent = new Intent(getExplicitIntent(mContext,mIntent));
startService(intent );
第二种方式:这是packetName;
Intent mIntent = new Intent();
mIntent.setAction("XXX.XXX.XXX");
mIntent.setPackage("XXX.XXX.XXX");//Service所在应用的包名
context.startService(mIntent);
我这边写一个第二种方法的例子,其他博客里面好像都是照抄的,都是一模一样的,而且传递的都是不明的参数,这边我很疑问,明明什么参数都不用去传递的呀;
switch (view.getId()){
case R.id.play:
Intent intent = new Intent();
intent.setAction("com.example.myapplication.Music");
intent.setPackage("com.example.myapplication");
startService(intent);
break;
case R.id.stop:
Intent intent1 = new Intent();
intent1.setAction("com.example.myapplication.Music");
intent1.setPackage("com.example.myapplication");
stopService(intent1);
break;
default:
break;
}
下面是我的简单的项目结构,可以进行参考: