2014-06-19 142 views
19

您知道當應用程序完全關閉時是否可以接收來自Google雲消息的通知?關閉應用程序時的推送通知

我知道它是開放還是後臺有,但是它可以通過任何方式編程以接收它們嗎?

編輯:

我繼續而不當應用程序被關閉接收通知。

我附上的代碼,以防萬一我有一個錯誤,我不看它。

清單

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

當應用程序在後臺:

w ^當該應用程序被用戶強行關閉時:通知未到達

問題是什麼?

非常感謝。

+0

@ user3757628:你是怎麼解決這個問題的? – user1090751

回答

2

我剛剛完成了一個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權限。 這允許使用PowerManagerWakeLocks來保持處理器免於睡眠或屏幕變暗。 但是,如果您擴展BroadcastReceiver,則該應用程序關閉後將無法工作。

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

但它不適用於棒棒糖設備,它在棒棒糖設備上工作正常。我需要爲棒棒糖設備添加任何東西嗎? – saikrupa

5

它不會對殺害從任務管理器應用程序的工作,但如果你只是從最近滑出工作。我試圖通過殺死whatsapp並要求某人發送msg給我,但我沒有收到任何通知。然後我啓動了應用程序,並收到通知。

+6

即使我將其從小米等設備上的近期應用程序中滑出,我也沒有收到通知。這些手機具有「自動啓動」功能,如果我爲自己的應用程序啓用自動啓動功能,即使將應用程序從最近的應用程序中移除,我也會收到推送通知。但我不希望用戶手動爲我的應用啓用自動啓動。還有其他應用程序,例如已啓用自動啓動的whatsapp,facebook。應用程序安裝時應該如何自動啓用自動啓動? –

+0

@NiteshKhatri對不起,沒有關於自動啓動的線索。 – berserk

+0

我也在華爲手機中找到同樣的問題。實際上,當從任務列表中清除應用程序時,它沒有收到任何通知。事實上,當我們這樣做時,它會殺死應用程序。你有沒有找到解決辦法? –

19

是的,當應用程序完全關閉時,可以'接收來自谷歌雲消息的通知'。

Infact,廣播接收機是GCM用來傳遞消息的機制。 您需要實施BroadcastReceiver並在AndroidManifest.xml中聲明它。

請參考以下代碼片段。

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()功能,其中可能你開始一項服務,爲您實際執行預期的任務。

上述代碼示例使用專門的BroadcastReceiver,稱爲WakefulBroadcastReceiver,它確保設備在服務正在工作時不會進入睡眠狀態。

參考官方Android的頁面是一樣的:https://developer.android.com/google/gcm/client.html

+0

最好的答案 –

+3

但它不適用於棒棒糖設備,它在棒棒糖設備上運行良好。我需要爲棒棒糖設備添加任何東西。 – saikrupa

+0

它不適用於聯想設備..對於其他設備,它工作正常 –

0

我一直在嘗試其他手機和第二工作完美,即使電話關機。首先有一個房間是不允許被通知當應用程序被關閉...... 感謝所有

18

當應用程序被用戶關閉forcelly:通知不到達

這是Android平臺的一項功能。用戶強制停止應用程序會將應用程序置於停止狀態,並且不會運行任何代碼,包括在清單中聲明的​​任何廣播接收器。只有在用戶明確啓動應用程序時,纔會將其置於接收者被解僱的狀態。

對於進一步閱讀:http://www.doubleencore.com/2014/06/effects-android-application-termination/

+0

有沒有任何方法可以通知用戶,以至於直到應用程序打開時才能收到通知,因爲例如,自動啓動管理器在安裝時禁用應用程序。所以GCM推送不工作。 –

+1

它確定..如果應用程序關閉時通知未到達。但是當應用程序再次啓動時,我沒有收到這些通知。它永久丟失了嗎? – shijin

+0

@yuen shi:是的。當您的應用程序關閉時,仍會將GCM推送消息傳送到您的設備。由於強制關閉的應用程序,你沒有得到任何通知。 – Rana

0

一些測試我對這個問題做了之後,我發現它的行爲在不同的應用程序是如何關閉。如果在電纜連接到設備時關閉應用程序,則會在應用程序關閉時阻止所有通知。 但是,如果將電纜從設備上取下並關閉應用程序,則當您發送通知時,所有操作都會再次進行,因爲它應該如此!

如果您收到「等待調試器」彈出消息,只需重新啓動設備,然後發送測試通知!

0

火力地堡API有兩種類型的消息,他們稱他們爲:

  • 通知
  • 數據

here

找到更多的信息要點:你不能從發送數據有效負載消息Firebase控制檯,控制檯只發送通知消息。所以我提到了如何使用郵遞員發送推送通知,請按照下面的步驟進行。

您必須返回,因爲數據有效載荷的數據有效載荷推送消息 - 不要緊,你的應用是否在前臺或後臺或被殺,這些消息會一直傳遞到onMessageReceived()方法。

的Android 8.0奧利奧如果應用程序被關閉,然後通知沒有收到這是因爲打盹模式,並優化電池,你就必須關閉電池優化爲所有應用或特定應用程序。

關閉電池優化你的應用程序通過下面的步驟:

設置>>電池>>電池優化>>查找應用>>選擇>>如果在優化單擊不優化>>嘗試推使用發送推送通知通知

郵遞員

步驟1:https://fcm.googleapis.com/fcm/send

步驟2:將此兩成部首

授權:鍵= 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" 
} 
} 

希望這會有所幫助..

享受:) :)

0

我在Oneplus手機上遇到同樣的問題。正如上面很多人所提到的,這個問題是有力的應用程序終止。就我而言,這是由於「近期應用程序管理」設置完成的,如下所示。一旦我將其更改爲「正常清除」設置,一切都開始正常工作。

enter image description here

相關問題