Android: 如何在服务中使用本地广播接收器

Android: how to have a localbroadcast reciever inside service

我有一个服务,我想在其中安装一个本地广播接收器。我想从 activity 接收到我的 onCreate 服务的值。

注意:我可以使用 intent 在 onStartCommand() 中从 activity 中为我的服务获取一个值。但是在这里,我想要服务的 onCreate 中 activity 的值。

以下是我的服务文件:

    public class MediaServiceSimha extends Service {

        private MediaPlayer player;
        String musicpath;
        private ResponseReceiver receiver;

        public MediaServiceSimha() {}

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        @Override
        public void onDestroy() {
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
            localBroadcastManager.unregisterReceiver(receiver);
            super.onDestroy();
        }

        @Override
        public boolean onUnbind(Intent intent) {
            return super.onUnbind(intent);
        }

        @
        Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            player.start();
            return super.onStartCommand(intent, flags, startId);
        }

        @Override
        public void onCreate() {
            super.onCreate();
            IntentFilter broadcastFilter = new IntentFilter("com.example.myintentserviceapp.intent_service.ALL_DONE");
            receiver = new ResponseReceiver();
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
            localBroadcastManager.registerReceiver(receiver, broadcastFilter);
        }

        public class ResponseReceiver extends BroadcastReceiver {

            @Override
            public void onReceive(Context context, Intent intent) {
                musicpath = intent.getStringExtra("musicpath");
            }
        }
    }

以下是我的 activity 文件,我想在其中传递一个名为 musicpath

的值
public class ServiceTest extends AppCompatActivity {
    Intent intent;

    public static final String TEXT_INPUT = "inText";
    //MediaServiceSimha mediaServiceSimha;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        L.m("activity_oncreate_starting");
        setContentView(R.layout.activity_service_test);
        intent= new Intent(this,MediaServiceSimha.class);

        startService(intent);

        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("com.example.myintentserviceapp.intent_service.ALL_DONE");
        broadcastIntent.putExtra("musicpath", "/storage/emulated/0/Download/1.mp3");
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
        localBroadcastManager.sendBroadcast(broadcastIntent)
    }


}

在运行之后,它说musicpath值为空。

怎么做?

当您调用启动服务时,并不意味着它会立即调用,因此请等待服务的创建,无论何时您的服务启动,您都可以向您的 activity 发送回调,然后您可以将值广播到您的服务

       public service callback()  // callback from service started
        {
        Intent broadcastIntent = new Intent();
                broadcastIntent.setAction("com.example.myintentserviceapp.intent_service.ALL_DONE");
                broadcastIntent.putExtra("musicpath", "/storage/emulated/0/Download/1.mp3");
                LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
                localBroadcastManager.sendBroadcast(broadcastIntent)
        } 


      public class MediaServiceSimha extends Service {
      @Override
            public void onCreate() {
                super.onCreate();
                IntentFilter broadcastFilter = new IntentFilter("com.example.myintentserviceapp.intent_service.ALL_DONE");
                receiver = new ResponseReceiver();
                LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
                localBroadcastManager.registerReceiver(receiver, broadcastFilter);
              sendCallback(); // using interface or broadcast receiver to send callback to activity
            }

}

我的目标是将变量值直接传递给服务中的 oncreate class。

我尝试了 LocalBroadcast 的接收器和 onbindservices - onServiceConnected

我发现它们只会在 oncreate 之前执行 -> onbind/onstartcommand 在服务中执行。

所以剩下的选项只有 onstartcommand()

所以当我们使用 intent 传递值时,它们可以立即在 onstartcommand 中使用。