【问题标题】:Push Notifications when app is closed应用关闭时推送通知
【发布时间】:2014-08-10 09:37:37
【问题描述】:

您知道当应用程序完全关闭时是否可以接收来自谷歌云消息的通知?

我知道它是打开的还是在后台,是的,但是可以通过任何方式对其进行编程以接收它们吗?

编辑:

当应用程序关闭时,我会继续,但不会收到通知。

我附上了代码以防万一我没有看它。

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.frab"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.frab.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<permission
android:name="com.frab.permission.C2D_MESSAGE"
android:protectionLevel="signature" />

<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.frab.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver
android:name=".GGMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.something" />
</intent-filter>
</receiver>

<service android:name=".GCMIntentService" />
</application>

</manifest>

广播接收器

package com.something;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.activities.SignIn;
import com.google.android.gcm.GCMBaseIntentService;
import com.objects.Globals;

public class GCMIntentService extends GCMBaseIntentService {
private static final String TAG = "GGM <-----> FRAB";
private Bundle extras;

public GCMIntentService() {
super(Globals.SENDER_ID);
}

@Override
public void onDestroy() {
Log.d(TAG, "terminando servicio");
}

@Override
protected void onRegistered(Context context, String registrationId) {
Log.i(TAG, "onRegistered: registrationId=" + registrationId);
}

@Override
protected void onUnregistered(Context context, String registrationId) {
Log.i(TAG, "onUnregistered: registrationId = " + registrationId);
}
@Override
protected void onMessage(Context context, Intent data) {
extras = data.getExtras();
String message = extras.getString("msg");
Log.d("******", message);
sendNotification(message);
}

@Override
protected void onError(Context arg0, String errorId) {
Log.e(TAG, "onError: errorId = " + errorId);
}    
}

package com.something;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;

public class GGMBroadcastReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// 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);
}
}

应用打开时:OK

当应用在后台时:好的

当应用被用户强行关闭时:通知未到达

有什么问题?

非常感谢。

【问题讨论】:

  • @user3757628:你是怎么解决这个问题的?

标签: android notifications push


【解决方案1】:

我在 Oneplus 手机上遇到了同样的问题。正如上面许多人所提到的,问题是强制终止应用程序。就我而言,这是由于“最近的应用程序管理”设置而完成的,如下所示。一旦我将其更改为“正常清除”设置,一切都开始正常工作。

【讨论】:

    【解决方案2】:

    Firebase API 有两种类型的消息,他们称之为:

    • 通知
    • 数据

    here获取更多信息

    重要提示:您无法从 Firebase 控制台发送数据负载消息,控制台仅发送通知消息。所以我已经提到了如何使用邮递员发送推送通知,请按照以下步骤操作。

    由于数据负载,您必须发送带有数据负载的推送消息 - 无论您的应用程序是在前台还是后台还是被杀死,这些消息都将始终传递到 onMessageReceived() 方法.

    Android 8.0 Oreo中,如果应用程序关闭,则不会收到通知这是因为打盹模式和电池优化,您只需关闭所有应用程序或特定应用程序的电池优化。

    通过以下步骤为您的应用关闭电池优化:

    设置>>电池>>电池优化>>找到你的应用>>选择>>如果优化点击不优化>>尝试推送通知

    使用 postman

    发送推送通知

    第一步:https://fcm.googleapis.com/fcm/send

    第2步:将这两个设置为Header

    授权:key=AIzaSyBuRl1Ikz3VXFvU7xW9mmg51lJ3uDSH

    内容类型:应用程序/json

    第 3 步:发送此 json

    {
     "to" : "eb9HgFulyzU:APA91bFMLReWWwilNFfJ1fnXZ0A2PhJAYsabg-UcK_dHgHQcstTzcxLs4_mqgOmZtUiyLMne4JaOG7f8KH7pWxB7JugOGCCYgjd4fUynRBKZvNUgjaj2UdJB2Ux8VocszuUydCX",
     "data" : {
         "message" : "First Notification",
         "title": "Push Notification",
         "key_1" : "Key 1 value",
         "key_2" : "Hello"
     }
    }
    

    希望这会有所帮助..

    享受:) :)

    【讨论】:

    • 所以基本上,我们需要发送“数据”有效负载以使消息传递工作。那么为什么没人想要“通知”有效负载呢?如果必须打开应用程序才能接收通知,它完全没用
    【解决方案3】:

    在我对这个问题进行了一些测试后,我发现它在关闭应用程序的方式上表现不同。如果在电缆连接到设备时关闭应用程序,它会在应用程序关闭时阻止所有通知。 但是,如果您从设备上取下数据线并关闭应用程序,当您发送通知时,一切都会恢复正常!

    如果您收到“等待调试器”弹出消息,只需重新启动设备,然后发送测试通知!

    【讨论】:

    • 我将提供更多详细信息:如果您正在调试应用程序,通知将首先起作用。然后,如果您关闭应用程序(从最近滑动),它们将无法工作。然后,您必须从设备手动重新启动应用程序(而不是通过调试)。您可以关闭它然后通知将到达。看起来当你关闭一个调试应用程序时,它的所有服务都停止了。我因此失去了 2 天。
    【解决方案4】:

    是的,可以“在应用程序完全关闭时接收来自谷歌云消息的通知”。

    事实上,广播接收器是 GCM 用来传递消息的机制。 您需要实现 BroadcastReceiver 并在 AndroidManifest.xml 中声明它。

    请参考以下代码sn-p。

    AndroidManifest.xml

    <receiver
        android:name=".GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.google.android.gcm.demo.app" />
        </intent-filter>
    </receiver>
    <service android:name=".GcmIntentService" />
    

    Java 代码

    public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // 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);
        }
    }
    

    当 GCM 向您的设备发送消息时,BroadcastReceiver 将收到该消息并调用onReceive() 函数,您可以在其中启动一个服务来实际为您执行预期的任务。

    上面的代码示例使用了一个名为WakefulBroadcastReceiver 的专用BroadcastReceiver,它确保设备在服务工作时不会进入睡眠状态。

    请参考Android官方页面:https://developer.android.com/google/gcm/client.html

    【讨论】:

    • 但它在棒棒糖之前的设备中不起作用,它在棒棒糖设备中工作正常。我需要为棒棒糖之前的设备添加任何东西吗。
    • 它不适用于联想设备.. 对于其他设备它工作正常
    • 它也不适用于小米手机,android 6版本。有任何解决方案
    • 对于某些手机,强制服务在后台运行会有所帮助。当应用程序退出时,使用 AlarmManager 安排服务。这应该确保 App 进程处于活动状态并且接收者正在监听广播。
    • 嗨,我正在主要活动中添加警报管理器。它在 mi 和三星设备上运行良好,但在 VIVO 和 OPPO 手机上我没有收到任何通知。
    【解决方案5】:

    我刚刚完成了一个 GCM 应用。 如果您关闭应用程序,它仍然可以正常工作。问题是您应该已经打开该应用程序一次。 创建两个类来实现这个目标:GcmBroadcastReceiverGcnIntentService。 查找更多信息 http://developer.android.com/google/gcm/index.html

    这就是诀窍

    public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {
        // 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);
    
    }
    }
    

    被扩展的类是WakeFulBroadcastReceiver。 Manifest.xml 中有 WAKE_LOCK 权限。 这允许使用 PowerManager WakeLocks 来防止处理器休眠或屏幕变暗。 但是,如果您扩展BroadcastReceiver,则在应用关闭后将无法使用。

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

    【讨论】:

    • 但是它在棒棒糖之前的设备中不起作用,在棒棒糖设备中可以正常工作。我需要为棒棒糖之前的设备添加任何东西吗?
    【解决方案6】:

    当应用被用户强行关闭时:通知不会到达

    这是 Android 平台的一项功能。用户强制停止应用程序会使应用程序处于停止状态,并且不会运行任何代码,包括清单中声明的​​任何广播接收器。只有当用户显式启动应用程序时,它才会处于接收器被触发的状态。

    进一步阅读:http://www.doubleencore.com/2014/06/effects-android-application-termination/

    【讨论】:

    • 是否有任何方法可以通知用户,以便您在应用打开之前无法收到通知,例如自动启动管理器在安装时禁用应用程序。所以 GCM 推送不起作用。
    • 没关系..如果应用关闭时通知没有到达。但是当应用程序再次启动时,我没有收到这些通知。它会永久丢失吗?
    • @yuen shi:是的。当您的应用程序关闭时,GCM 推送消息仍会发送到您的设备。由于强制关闭应用程序,您没有收到任何通知。
    • 那么whatsapp应用和其他聊天应用是如何工作的呢?
    • 这是不正确的。应用关闭后,通知等服务继续运行。
    【解决方案7】:

    我一直在尝试另一部手机,第二部手机运行良好,即使在手机关机的情况下也是如此。第一个房间在应用程序关闭时不允许收到通知...... 谢谢大家

    【讨论】:

      【解决方案8】:

      它不能从任务管理器中杀死应用程序,但如果你只是将它从最近的位置滑开,它就可以工作。我尝试通过杀死它并要求某人向我发送消息来对whatsapp进行操作,但我没有收到任何通知。然后我启动了应用程序,我收到了通知。

      【讨论】:

      • 即使我将其从小米等某些设备上的最新应用程序中滑出,我也不会收到通知。这些手机中有一个“自动启动”功能,如果我为我的应用程序启用自动启动,那么即使我将应用程序从最近的应用程序中滑开,我也会收到推送通知。但我不希望用户手动为我的应用启用自动启动。还有其他应用程序,如 whatsapp、facebook 已经启用了自动启动。应用安装时如何启用自动启动?
      • @NiteshKhatri 抱歉,没有关于自动启动的线索。
      • 我也在华为手机中获取同样的问题。实际上,当应用程序从任务列表中清除时,它没有收到任何通知。实际上,当我们这样做时,它会杀死应用程序。你找到解决办法了吗?
      • @Md.SajedulKarim 这似乎不是正常行为。从最近清除应用程序不应该杀死应用程序(在内存不足的情况下,任何应用程序都可能被操作系统杀死,但我认为一旦你滑开它就不会发生)。我会说设备操作系统有问题(可能是供应商的错)
      猜你喜欢
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多