【问题标题】:Android: how to have a localbroadcast reciever inside serviceAndroid:如何在服务中拥有本地广播接收器
【发布时间】:2016-06-18 05:19:09
【问题描述】:

我有一个服务,我想要一个本地广播接收器。我想从活动中获得一个价值到我的服务 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。

怎么做?

【问题讨论】:

  • 你根本不需要它:在调用 startService 时将“musicpath”传递给 extras
  • 我对您的问题感到非常困惑:您在服务的 onCreate 中注册广播接收器这一事实并不意味着您会在那里收到意图。每次您需要使用 startService 时,只需在意图中传递您需要的任何信息...
  • 但是你为什么要这样做呢?如果您真的想将 PATH 传递给服务,请将其放在 Extra(..) 并在服务中接收
  • 当你调用start service时并不意味着它会立即调用,所以等待服务的oncreate,当你收到服务的回调时,你可以发送广播

标签: android android-service localbroadcastmanager


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 评论//using interface or broadcast receiver to send callback to activity 是什么意思。我第一次遇到public service callback()。我对此完全陌生。你能帮我更多地了解这些
    • @SanthoshYedidi 你根本不需要LocalBroadcastManager:只需在调用startService 时通过额外的“musicpath”即可
    • 但我想在 oncreate 中使用音乐路径,而不是在 onstartcommand() 中。 onCreate 先启动后 onstartcommand
    • @SanthoshYedidi 所以你需要改变你的设计,在Intent's extras 中传递它有什么问题?
    • 因为我想在 oncreate 中启动媒体播放器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多