【问题标题】:Android BroadcastReceiver Not being called after app closed from Running App List从正在运行的应用程序列表关闭应用程序后未调用Android BroadcastReceiver
【发布时间】:2015-07-03 07:07:28
【问题描述】:

在尝试在 android 应用程序中实现通知时,我发现如果用户从正在运行的应用程序列表中关闭应用程序,通知将不再起作用(顶部向下滑动然后水平滑动 - 不强制退出,这会正确关闭根据谷歌规范的所有未来调用)。使用后退按钮有时会导致相同的行为,但并非总是如此。

从我所研究的一切中我的理解是,只有用户强制停止才能阻止广播接收器被调用。

这是来自 Android Manifest 的相关代码和设置,请注意,当应用打开或通过主页按钮离开时,一切正常。

Android Manifest 相关部分:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

    <receiver
        android:name="mypackage.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="mypackage.android" />
        </intent-filter>
        <intent-filter>
            <action  android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="mypackage.android" />
        </intent-filter>
    </receiver>
    <service
        android:name="mypackage.gcm.GCMIntentService"
        android:stopWithTask="false"
        android:exported="false">
    </service>

这是我覆盖WakefulBroadcastReceiver的类:

public class GCMBroadcastReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(final Context context, final Intent intent) {
    try {
        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),  GCMIntentService.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    } catch(Exception e) {
        //Log it, and move on
        Log.d("GCMBroadcastReceiver", "onReceive", e);
    }
}

【问题讨论】:

  • 你应该尝试将它与服务一起使用。
  • 您是否调试过您的代码并检查您的onMessage() 通知方法是否在应用关闭并收到任何推送通知时被调用。
  • @Amrut - 谢谢,可以详细说明吗?我已经研究过服务,但从我所看到的情况来看,不确定这会有什么帮助。 BroadcastReceiver 正在调用服务(IntentService)来发布通知,您是否建议我将 BroadcastReceiver 本身包装在服务中?
  • @Clairvoyant - 是的,BroadcastReceiver.OnReceive() 和 IntentService 中的任何方法都没有被调用。实际上不确定您指的是哪个 'onMessage()' 方法。
  • @Clairvoyant - 关于调试,当应用程序通过在正在运行的应用程序列表中滑动关闭时,调试器本身会分离,因此在这种情况下无法调试,尽管 BroadcastReceiver 中的跟踪器停止获取输出所以很明显 onReceive() 没有被调用。

标签: android broadcastreceiver android-service google-cloud-messaging android-notifications


【解决方案1】:

看起来您偶然发现了与我相同的issue,我猜使用 GCMReceiver 和 GCMListenerService 对您也不起作用。 这个问题是一个报告的bug。希望票证中的解决方法对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多