接收器停止在奥利奥接收

时间:2017-09-02 15:28:32

标签: android broadcastreceiver

我了解服务等因此受到限制,因此我的接收器已停止在Android Oreo中工作。

我有这个代码启动服务 -

Intent intent = new Intent(this, MyService.class);
intent.putExtra("Time", locationUpdatesTime);
intent.putExtra("Dist", locationUpdatesDistance);
startService(intent);

我的服务中有这个 -

Intent intent = new Intent();
intent.setAction("com.androidandyuk.laptimerbuddy");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.putExtra("Lat", thisLat);
intent.putExtra("Lon", thisLon);

sendBroadcast(intent);

但我的接收器从未被叫过。在我四处搜索之后,我想我必须注册我的接收器,但我无法用正确的语法来计算我的编码方式。有人可以帮忙吗?

如果你想向我投票,我很感激,如果你会评论为什么,我可以学习,因为我找到了答案,无法找到/理解它,我想我和我我按照自己的意愿提出了问题: - )

非常感谢!

更新尝试使用LocalBroadcastManager。

在MainActivity中我有 -

BroadcastReceiver mMessageReceiver;

onCreate我有 -

mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Get extra data included in the Intent
            String message = intent.getStringExtra("message");
            Log.i("receiver", "Got message: " + message);
        }
    };
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));

在我的服务中,onLocationChanged

    Log.i("sender", "Broadcasting message");
                Intent intent = new Intent();
                intent.setAction("custom-event-name");
                intent.putExtra("message", "This is my message!");

 LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

当我看到发件人信息时,这是有效的。

我做错了什么?

2 个答案:

答案 0 :(得分:7)

自Android Oreo以来,必须使用context.registerReceiver(receiver,intentFilter)在运行时注册接收器;接收隐含意图

您仍然可以接收显式意图和一些特殊的隐式操作,例如boot_completed或locale_changed

https://developer.android.com/about/versions/oreo/background.html#broadcasts

的更多信息

答案 1 :(得分:3)

创建你的意图而不是传递方法

 sendImplicitBroadcast(this,new Intent(IntentActions.ACTION_APP_CREATE));

静态方法

public static void sendImplicitBroadcast(Context ctxt, Intent i) {
    PackageManager pm=ctxt.getPackageManager();
    List<ResolveInfo> matches=pm.queryBroadcastReceivers(i, 0);

    for (ResolveInfo resolveInfo : matches) {
        Intent explicit=new Intent(i);
        ComponentName cn=
                new ComponentName(resolveInfo.activityInfo.applicationInfo.packageName,
                        resolveInfo.activityInfo.name);

        explicit.setComponent(cn);
        ctxt.sendBroadcast(explicit);
    }
}