1

我有一个服务,我想要一个本地广播接收器。我想从活动中获得价值到我的服务 onCreate。

注意:我可以使用意图在 onStartCommand() 中从活动中获取一个值到我的服务。但在这里,我想从服务的 onCreate 中的活动中获得价值。

以下是我的服务文件:

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

以下是我的活动文件,我想在其中传递一个名为 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)
    }


}

运行后,它说音乐路径值为空。

怎么做?

4

2 回答 2

0

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

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

我发现他们两个都只会被执行,直到 oncreate -> onbind/onstartcommand 在服务中执行。

所以剩下的唯一选择是 onstartcommand()

因此,当我们使用意图传递值时,它们可以立即在 onstart 命令中使用。

于 2016-06-20T13:53:49.637 回答
-1

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

       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
            }

}
于 2016-06-18T05:36:30.177 回答