Service Intent must be explicit: Intent { act=com.example.myapplication.Music }

下面是我的控制檯報錯結果:

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;
            }

下面是我的簡單的項目結構,可以進行參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章