2015-06-08 16 views
9

Tôi thấy một số cách tiếp cận và tôi đã cố gắng tất cả mọi thứ nhưng couldnt làm cho nó work.I không biết lý do tại sao nó là quá phức tạp, trong các tài liệu có vẻ dễ dàng như vậy! Tôi muốn kích hoạt OnNewIntent với một thông báo (người dùng nhấp vào nó trong thanh thông báo).Android OnNewIntent không được gọi

Hiện nay tôi đã thiết Hoạt động của tôi như singleTop

<activity 
    android:name="-.-.-.MainMenuActivity" 
    android:launchMode="singleTop" 
    android:screenOrientation="portrait" > 
</activity> 

Đây là mã mà tôi tạo ra các thông báo:

public void showNotification(String text, String componentId){ 
    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.logo) 
      .setContentTitle("Title") 
      .setAutoCancel(true) 
      .setContentText(text); 

    // Creates an explicit intent for an Activity in your app 
    Intent resultIntent = new Intent(this, MainMenuActivity.class); 
    if(!componentId.equalsIgnoreCase("")){       
     resultIntent.putExtra("componentId", componentId); 
    } 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0); 
    mBuilder.setFullScreenIntent(resultPendingIntent, false); 
    mBuilder.setContentIntent(resultPendingIntent); 
    NotificationManager mNotificationManager = 
     (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    // mId allows you to update the notification later on. 
    mNotificationManager.notify(0, mBuilder.build()); 
} 

Đây là phương pháp OnNewIntent trong MainMenuActivity tôi:

@Override 
protected void onNewIntent(Intent intent) { 
    // TODO Auto-generated method stub 
    super.onNewIntent(intent); 
    setIntent(intent); 

    ... 
} 

Tôi chưa bao giờ nhận được cuộc gọi OnNewIntent. Tôi không biết mình đang làm gì sai. Tôi chỉ sử dụng 2 hoạt động trong toàn bộ ứng dụng và MainMenuActivity xuất hiện sau LoginActivity nên MainMenuActivity luôn luôn nằm trên đầu stack (tôi có nhiều mảnh hơn khi thay thế chúng bên trong MainMenuActivity).

Bất kỳ trợ giúp sẽ được đánh giá cao! Cảm ơn các bạn.

+0

bạn đã bao giờ nhận được bất cứ nơi nào với điều này? Tôi đang ở trong tình trạng tương tự. – Piwaf

Trả lời

9

Ok làm cho nó hoạt động ngay sau khi đăng câu hỏi của tôi. Tôi nghĩ rằng sự khác biệt chính trong mã của chúng tôi là tôi vượt qua cờ "PendingIntent.FLAG_UPDATE_CURRENT" để tạo/truy xuất đối tượng PendingIntent. Điều này post đã giúp tôi tìm ra điều đó.

Notification.Builder mBuilder = 
       new Notification.Builder(context) 
       .setSmallIcon(R.drawable.notifyicon) 
       .setContentTitle(title) 
       .setContentText(extras.getString("message")) 
       .setAutoCancel(true) 
       .setOnlyAlertOnce(false) 
       .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
       .setVibrate(new long[] {0,500,250,500}); 

     if(badgeCount > 1) 
      mBuilder.setNumber(badgeCount); 
     // Creates an explicit intent for an Activity in your app 
     Intent resultIntent = new Intent(context, SiteViewActivity.class); 
     resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     resultIntent.putExtra(NOTIFY_INTENT_TYPE_KEY, alertType); 

     PendingIntent resultPendingIntent = PendingIntent.getActivity(context, alertType, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     mBuilder.setContentIntent(resultPendingIntent); 
     NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     notifyMgr.notify(alertType, mBuilder.build()); 
+0

bạn cũng thêm giá trị 'alertType' - đó là chìa khóa cho cùng một vấn đề của tôi !! thnks! –

0

Sau khi kiểm tra lâu tôi nhận thấy rằng Android 4.4 (Kitkat và có thể thấp hơn) sẽ không gọi onNewIntent và onResume không nếu bạn sử dụng FLAG_UPDATE_CURRENT trên pendingIntent. Khi bạn thay đổi thành FLAG_ONE_SHOT, nó sẽ bắt đầu hoạt động. trên Android 6 (và có thể là 5) tuy nhiên trênNewIntent hoạt động ngay cả với cờ FLAG_UPDATE_CURRENT. Tuy nhiên, có vẻ như nếu bạn tạo nhiều ý định đang chờ xử lý (ví dụ sau khi nhận được hai thông báo), dữ liệu sẽ không được cập nhật với cờ FLAG_ONE_SHOT, vì vậy, cờ FLAG_CANCEL_CURRENT có thể là lựa chọn tốt hơn (không có vấn đề với dữ liệu chưa cập nhật)

2

như đầu tiên, bạn nên thêm android:launchMode="singleTop" định nghĩa hoạt động của bạn trong file manifest như dưới đây

<activity 
    android:name="MainActivity" 
    android:launchMode="singleTop" 
</activity> 

Rồi như Hasan Masud nói rằng, bạn nên thêm Intent.ACTION_MAINIntent.CATEGORY_LAUNCHER đến hành động của bạn như dưới đây

Intent intent = new Intent(this, MainActivity.class); 
intent.setAction(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 

Đó là tất cả. Bằng cách này, nếu ứng dụng đang mở và khi bạn nhấp vào thông báo, phương thức onNewIntent (..) sẽ kích hoạt nhưng bất kỳ điều gì xảy ra, nếu ứng dụng ở gần, khi bạn nhấp vào thông báo, ý định thông báo sẽ chuyển đến onCreate (..) phương thức Hoạt động hiện tại.

+0

Bạn là người giỏi nhất! Nó đã cho tôi mãi mãi để thấy rằng bạn cần phải thêm Intent.ACTION_MAIN và INTENT.CATEGORY_LAUNCHER !!! Tôi chưa thấy nó được viết ở đâu cả ... – Mars

Các vấn đề liên quan