2012-06-30 118 views
19

我有兩個按鈕的應用程序來執行的方法。一個「關閉」應用程序和一個開始算法的按鈕。當我點擊「開始」時,它「隱藏」應用程序,並在通知欄中顯示通知。我需要能夠在點擊/按下通知時執行/調用方法。這類問題有幾個答案,但它們非常含糊,只有一個指向與BroadcastReceiver上文檔的鏈接。如何通過點擊通知

如果你要離開一個URL到廣播接收器doc和說:「閱讀此頁,」請不要回答這個問題。如果您要解釋如何使用BroadcastReceiver執行方法(從顯示通知的同一類中),請向我演示如何完成此操作的一些代碼。

我的算法:按一個按鈕,顯示通知,單擊通知,調用一個方法(不顯示活動)。而已。

如果這是不可能的,只是讓我知道。如果是這樣,請告訴我你會怎麼做才能做到這一點。這個簡單的東西不應該被android sdk的開發者忽略。

+0

我只得到了通知管理器通知並顯示在通知欄中的通知。當我點擊通知時,它會打開活動。我想通過調用/執行一個方法而不是打開活動來修改此行爲。我正在嘗試與Arfin的解決方案合作。我只是沒有看到我應該如何做到這一點。我創建了一個「DummyActivity」,我不確定他的解決方案的第二部分是否應該在「DummyActivity」中。我只是困惑。我喜歡當事情順利進行時。 – AnDev

+0

是的,AnDev一旦你的虛擬活動開始發送一個廣播從他們剛剛完成,所以現在你會收到父類的廣播消息,正如我已經解釋過的,你可以從那裏調用任何你想要的方法。除了發送廣播和完成它之外,不需要在虛擬活動中進一步做任何事情。 –

回答

8

看穿通知點擊我們不能得到任何火災事件或任何點擊監聽器,同時加入我們用來設定等候意圖通常開始的活動,一旦通知點擊或按下通知欄應用程序。但我有一個解決方案,如果你真的不想顯示你的活動,那麼將以未決意圖開始的活動從那裏發送廣播到你的父母活動,並完成未完成的活動,然後一旦廣播接收機在父母活動中接收任何你想在接收者裏面想要的方法。供您參考..

// This is what you are going to set a pending intent which will start once 
// notification is pressed. Hopes you know how to add notification bar. 
Intent notificationIntent = new Intent(this, dummy_activity.class); 
notificationIntent.setAction("android.intent.action.MAIN"); 
notificationIntent.addCategory("android.intent.category.LAUNCHER"); 
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
           notificationIntent, 
           PendingIntent.FLAG_UPDATE_CURRENT | 
           Notification.FLAG_AUTO_CANCEL); 

// Now, once this dummy activity starts send a broad cast to your parent activity and finish the pending activity 
//(remember you need to register your broadcast action here to receive). 
    BroadcastReceiver call_method = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action_name = intent.getAction(); 
       if (action_name.equals("call_method")) { 
        // call your method here and do what ever you want. 
       } 
      }; 
     }; 
     registerReceiver(call_method, new IntentFilter("call_method")); 
    } 
} 
+0

謝謝你的迴應。這是非常徹底和有用的。 – AnDev

+0

如果我想要檢查應用程序是否處於前臺或未處於通知點擊事件狀態,並且根據您的代碼@Daud Arfin,如果我們啓動活動,它將始終返回該應用程序處於前臺。是否有任何其他方式來檢查應用程序是否在前臺或沒有通知點擊事件 –

+0

@Er Kimmi Dhingra - 你可以依靠android生命週期..維護onPause/onStop和onResume/onStart內的標誌。 –

-3
protected void displayNotification() { 
    Log.i("Start", "notification"); 

    /* Invoking the default notification service */ 
    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(this); 
    mBuilder.setAutoCancel(true); 

    mBuilder.setContentTitle("New Message"); 
    mBuilder.setContentText("You've received UnRead message."); 
    mBuilder.setTicker("New Message Alert!"); 
    mBuilder.setSmallIcon(R.drawable.icon2); 

    /* Increase notification number every time a new notification arrives */ 
    mBuilder.setNumber(++numMessages); 

    /* Creates an explicit intent for an Activity in your app */ 

    Intent resultIntent = new Intent(this, FreesmsLog.class); 

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
    stackBuilder.addParentStack(FreesmsLog.class); 

    /* Adds the Intent that starts the Activity to the top of the stack */ 
    stackBuilder.addNextIntent(resultIntent); 
    PendingIntent resultPendingIntent = 
      stackBuilder.getPendingIntent(
        0, 
        PendingIntent.FLAG_UPDATE_CURRENT 
      ); 
    mBuilder.setContentIntent(resultPendingIntent); 
    mNotificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    /* notificationID allows you to update the notification later on. */ 
    mNotificationManager.notify(notificationID, mBuilder.build()); 

} 
+9

好像來自Google示例代碼的複製粘貼。不回答OP的問題。 – cdkn7

27

經過反覆試驗反覆幾次,我終於找到了一個非常簡單和乾淨的方法是點擊一個通知的動作時運行任意方法。在我的解決方案中,有一個類(我稱之爲NotificationUtils)創建通知,並且還包含一個IntentService靜態內部類,當點擊通知的操作時將運行該內部類。這裏是我NotificationUtils類,其次是進行必要的修改,以AndroidManifest.xml中:

public class NotificationUtils { 
    public static final int NOTIFICATION_ID = 1; 

    public static final String ACTION_1 = "action_1"; 

    public static void displayNotification(Context context) { 

     Intent action1Intent = new Intent(context, NotificationActionService.class) 
      .setAction(ACTION_1); 

     PendingIntent action1PendingIntent = PendingIntent.getService(context, 0, 
       action1Intent, PendingIntent.FLAG_ONE_SHOT); 

     NotificationCompat.Builder notificationBuilder = 
       new NotificationCompat.Builder(context) 
         .setSmallIcon(R.drawable.ic_launcher) 
         .setContentTitle("Sample Notification") 
         .setContentText("Notification text goes here") 
         .addAction(new NotificationCompat.Action(R.drawable.ic_launcher, 
           "Action 1", action1PendingIntent)); 

     NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
     notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); 
    } 

    public static class NotificationActionService extends IntentService { 
     public NotificationActionService() { 
      super(NotificationActionService.class.getSimpleName()); 
     } 

     @Override 
     protected void onHandleIntent(Intent intent) { 
      String action = intent.getAction(); 
      DebugUtils.log("Received notification action: " + action); 
      if (ACTION_1.equals(action)) { 
       // TODO: handle action 1. 
       // If you want to cancel the notification: NotificationManagerCompat.from(this).cancel(NOTIFICATION_ID); 
      } 
     } 
} 

現在只是實現onHandleIntent你的行動和NotificationActionService的<application>標籤內添加到您的清單:

<service android:name=".NotificationUtils$NotificationActionService" /> 

簡介:

  • 創建一個將創建通知的類。
  • 在該類中,添加一個IntentService內部類(確保它是靜態的,否則您將得到一個神祕錯誤!),它可以基於單擊的操作運行任何方法。
  • 在清單中聲明IntentService類。
+0

如果「操作」字段已在使用中,該怎麼辦?像「ACTION_VIEW」 –

+0

您可以向意圖添加一個額外的內容,例如action1Intent.putExtra(「action1extra」,1),然後在onHandleIntent中使用if(intent.getIntExtra(「action1extra」,-1)== 1){...} –

+0

花了我一天中更好的一部分到目前爲止尋找一種方法來做到這一點。很高興我找到了你的答案,就像一個魅力。 – kalenpw