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


}

実行後、musicpath の値が null であると表示されます。

どうやってするの?

4

2 に答える 2

0

私の目標は、変数値をサービス クラスの oncreate に直接渡すことでした。

LocalBroadcast のレシーバーと onbindservices - onServiceConnected も試しました

どちらも、サービスで oncreate -> onbind/onstartcommand が実行されるまでしか実行されないことがわかりました。

したがって、残っているオプションは onstartcommand() だけです

したがって、インテントを使用して値を渡すと、onstartcommand 内ですぐに使用できます。

于 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 に答える