2017-08-08 13 views
0

當應用處於前景或背景時,我收到來自fcm的通知。 我不想顯示通知當特定活動中的應用程序如何在應用程序處於特定活動時禁用通知。如何隱藏特定活動的通知?

我使用datapaylod來通知

+0

殺服務 –

回答

0

試試這個,開始活動,並重新啓動它在離開活動時前

private void sendNotification(String msg) { 
    Intent notificationIntent = null; 
    notificationIntent = new Intent(currentactivity.this, Main2Activity.class); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 


    PendingIntent contentIntent = PendingIntent.getActivity(GCMNotificationIntentService.this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

    NotificationManager nm = (NotificationManager) GCMNotificationIntentService.this.getSystemService(Context.NOTIFICATION_SERVICE); 

    Resources res = GCMNotificationIntentService.this.getResources(); 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(GCMNotificationIntentService.this); 
    builder.setContentIntent(contentIntent) 
      .setSmallIcon(R.drawable.app_logo_small_trans) 
      .setColor(getResources().getColor(R.color.app_logo_color)) 
      .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.app_logo)) 
      .setTicker(msg) 
      .setWhen(System.currentTimeMillis()) 
      .setAutoCancel(true) 
      .setContentTitle("Propreka") 
      .setLights(0xffff0000, 100, 2000) 
      .setPriority(Notification.DEFAULT_SOUND) 
      .setContentText(msg); 

    Notification n = builder.getNotification(); 

    n.defaults |= Notification.DEFAULT_ALL; 
    nm.notify(0, n); 

} 
0

所以,你想知道哪個(如果有的話)的活動是在目前前景。取決於班級類型,要限制通知的顯示。

你需要自己維護它。最簡單的方法是寫一個新的類,有公共靜態函數在它一旦你有這樣一個紅外標記活動爲有效/無效

public static Activity mCurrentActivity = null; 

public static void SetActivity(Activtiy activity) { mCurrentActivity = activity }; 

public static void ClearActivity(Activtiy activity) 
{ 
    if (mCurrentActivity.equals(activity)) 
     mCurrentActivity = null; 
} 

public static Activity GetCurrentActivity() { return mCurrentActivity; } 

,您可以撥打SetActivity和ClearActivity功能在所有的onResume和onPause分別覆蓋。

最後,在您的通知構建器類中,您將獲取當前活動的實例並比較.class,以檢查您的期望活動是否是焦點所在。如果Current活動返回null,則表示您的應用程序不在前臺。

有更好,更有效和更乾淨的方法來做到這一點。例如。用Daggr進行依賴注入。

0

您可以通過檢查目前的頂級活動:

public static Activity getActivity() { 
Class activityThreadClass = Class.forName("android.app.ActivityThread"); 
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null); 
Field activitiesField = activityThreadClass.getDeclaredField("mActivities"); 
activitiesField.setAccessible(true); 

Map<Object, Object> activities = (Map<Object, Object>) activitiesField.get(activityThread); 
if (activities == null) 
    return null; 

for (Object activityRecord : activities.values()) { 
    Class activityRecordClass = activityRecord.getClass(); 
    Field pausedField = activityRecordClass.getDeclaredField("paused"); 
    pausedField.setAccessible(true); 
    if (!pausedField.getBoolean(activityRecord)) { 
     Field activityField = activityRecordClass.getDeclaredField("activity"); 
     activityField.setAccessible(true); 
     Activity activity = (Activity) activityField.get(activityRecord); 
     return activity; 
    } 
} 

return null; 
} 

您可以檢查是否頂部的活動是在你不想顯示通知,然後返回從服務呼叫的活動。