将数据从通知发送到活动,并使活动相应地发挥作用

时间:2015-03-23 10:04:36

标签: android notifications

我有两种类型的通知,即下载和上传通知。 它将通过单击通知打开活动,并且活动有两个片段选项卡,一个用于下载,一个用于上载。 我想要的是,当点击上传通知时,它不仅启动活动而是打开特定标签,与下载部分相同。

以下是我的所作所为。

 // configure the intent
    Intent dIntent = new Intent(this, TransferActivity.class);
    dIntent.putExtra(WidgetUtils.NOTIFICATION_MESSAGE_KEY, WidgetUtils.NOTIFICATION_OPEN_DOWNLOAD_TAB); // open download task tab
    dIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent dPendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, dIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    downloadNotification = new Notification(R.drawable.notification_bar_downloading, getString(R.string.notification_bar_title_download_started), System.currentTimeMillis());
    downloadNotification.flags |= Notification.FLAG_AUTO_CANCEL;
    downloadNotification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_bar_progress_layout);
    downloadNotification.contentIntent = dPendingIntent;

    Intent uIntent = new Intent(this, TransferActivity.class);
    uIntent.putExtra(WidgetUtils.NOTIFICATION_MESSAGE_KEY, WidgetUtils.NOTIFICATION_OPEN_UPLOAD_TAB); // open upload task tab
    uIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent uPendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, uIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    uploadNotification = new Notification(R.drawable.notification_bar_uploading, getString(R.string.notification_bar_title_upload_started), System.currentTimeMillis());
    uploadNotification.flags |= Notification.FLAG_AUTO_CANCEL;
    uploadNotification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_bar_progress_layout);
    uploadNotification.contentIntent = uPendingIntent;

    notificationManager = (NotificationManager) getApplicationContext().getSystemService(getApplicationContext().NOTIFICATION_SERVICE);

我在Activity中像这样处理传递的数据

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        onNewIntent(getIntent());
    }

@Override
    protected void onNewIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            if (extras.containsKey(WidgetUtils.NOTIFICATION_MESSAGE_KEY)) {
                // extract the extra-data in the Notification
                String msg = extras.getString(WidgetUtils.NOTIFICATION_MESSAGE_KEY);
                if (msg.equals(WidgetUtils.NOTIFICATION_OPEN_DOWNLOAD_TAB)) {
                    currentPosition = 0;
                    indicator.setCurrentItem(0);
                } else if (msg.equals(WidgetUtils.NOTIFICATION_OPEN_UPLOAD_TAB)) {
                    currentPosition = 1;
                    indicator.setCurrentItem(1);
                }
            }
        }
    }

但问题是,无论我点击哪种类型的通知,它始终会启动“上传”标签。这真令人困惑。
有人可以帮忙吗? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

我最近遇到过类似的问题。经过一番调查后,我发现onNewIntent被调用Intent。我最终使用的解决方法对我来说非常好。我会和你分享。

  1. 不要通过TransferActivity致电Intent,而是引入中间人NotificationChannelActivity。然后,所有通知点击都将被引导给这个中间人。
  2. 提取通过中间人Intent传递的数据并将其传递给TransferActivity。您可以使用getIntent API提取数据,然后在新的Intent中重新打包,然后启动TransferActivity,以便完成对数据的实际处理。
  3. 在`PendingIntent:

    中使用唯一标识符

    int iUniqueId =(int)(System.currentTimeMillis()& 0xfffffff); PendingIntent.getActivity(getApplicationContext(),iUniqueId,uIntent,PendingIntent.FLAG_UPDATE_CURRENT);

答案 1 :(得分:0)

根据http://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent)的文档,您的onNewIntent可能无法被调用。

  

这是为将launchMode设置为" singleTop"在他们的包中,或者如果客户端在调用startActivity(Intent)时使用了FLAG_ACTIVITY_SINGLE_TOP标志。在任何一种情况下,当在活动堆栈的顶部而不是正在启动的活动的新实例重新启动活动时,将在现有实例上使用用于重新启动的Intent调用onNewIntent()它

     

在接收新意图之前,活动将始终暂停,因此您可以指望在此方法之后调用onResume()。

     

请注意,getIntent()仍会返回原始的Intent。您可以使用setIntent(Intent)将其更新为此新Intent。   因此,如果您的活动是正常的,您应该在onCreate()或onResume()中使用来自getIntent()的intent。

此外,要处理这两种情况,您可以考虑在onNewIntent()中调用setIntent(),并在文档中建议使用onResume()中的getIntent。