恢复singleTask活动

时间:2015-03-23 23:18:13

标签: android cordova android-intent notifications

我正在尝试"恢复"单个任务活动,以便在用户单击我的通知时显示在前台。 (与用户从应用程序菜单中点击应用程序图标的行为相同。)

我的通知会创建一个PendingIntent,用于广播我的广播接收器接收的动作。如果应用程序不在前台,我会尝试恢复应用程序。另外,我试图通过意图将消息传递给我的onResume函数。但是,我遇到了错误:

Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

尽管有这个错误,我的应用程序正在恢复......不明白为什么。但是,我的额外内容没有被传递给我的onResume函数。

首先我创建一个通知。

public static class MyNotificationCreator {

  private static final int MY_NOTIFICATION_ID = 987;

  public static void createNotification(Context context) {
    Intent openAppIntent = new Intent(context, MyReceiver.class);
    openAppIntent.setAction("PleaseOpenApp");
    PendingIntent pi = PendingIntent.getBroadcast(context, /*requestCode*/0, openAppIntent, /*flags*/0);

    Notification notification = ne Notification.Builder(context)
      .setContentTitle("")
      .setContentText("Open app")
      .setSmallIcon(context.getApplicationInfo().icon)
      .setContentIntent(pi)
      .build();

    NotificationManager notificationManager = (NotificationManager) applicationContext.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(MY_NOTIFICATION_ID, notification);  }
}

哪个广播" PleaseOpenApp"对于MyReceiver。

public class MyReceiver extends BroadcastReceiver {
  @Override
  public void onRecieve(Context context, Intent intent) {
    if (intent.action() == "PleaseOpenApp" && !MyPlugin.isForeground) {
      PackageManager pm = context.getPackageManager();
      //Perhaps I'm not supposed to use a "launch" intent?
      Intent launchIntent = pm.getLaunchIntentForPackage(context.getPackageName());
      //I'm adding the FLAG_ACTIVITY_NEW_TASK, but I'm still hitting an error saying my intent does not have the FLAG_ACTIVITY_NEW_TASK...
      launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      launchIntent.putExtra("foo", "bar");
      context.startActivity(launchActivity);
    } else {
      //do other stuff
    }
  }
}

我的插件会跟踪我们是否在前台。此外,它试图获得"食物"在我的接收器尝试启动应用程序之后。

public class MyPlugin extends CordovaPlugin {

  public static boolean isForeground = false;

  @Override
  public void initialize(CordovaInterface cordova, CordovaWebView webview) {
    super.initialize(cordova, webview);
    isForeground = true;
  }

  @Override
  public void onResume(boolean multitasking) {
    isForeground = true;
    String foo = activity.getIntent().getStringExtra("foo");
    Log.d("MyPlugin", foo); //foo is null after clicking the notification!
  }

  @Override
  public void onPause(boolean multitasking) {
    isForeground = false;
  }

  @Override
  public void onDestroy() {
    isForeground = false;
  }
}

注意:因为我使用cordova我的活动有一个singleTask launchMode。

此外,我是Android开发的新手,所以任何有关恢复活动的帮助都不在前台与恢复已被销毁的活动以及有关我不理解的一般概念/最佳实践的信息将不胜感激!

2 个答案:

答案 0 :(得分:1)

我不认为您的广播/广播接收器模式是必要的。

Intent可以用来直接启动一个活动,当你构建Intent时,可以添加额外的东西。然后,您的活动onResume()可以直接提取它们。

以下是可以在通知中发送的Intent和PendingIntent结构示例:

Intent startActivity = new Intent(context, MyActivity.class);
// You can experiment with the FLAGs passed here to see what they change
startActivity.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
                    .putExtra("Extra1", myExtra1)
                    .putExtra("Extra2", myExtra2)
                    // ADDING THIS MAKES SURE THE EXTRAS ATTACH
                    .setAction("SomeString"); 

// Then, create the PendingIntent
// You can experiment with the FLAG passed here to see what it changes
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, startActivity, PendingIntent.FLAG_UPDATE_CURRENT);

// Then, create and show the notification
Notification notif = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.my_small_icon)
            .setContentTitle(myTitle)
            .setContentText(myContent)
            .setOngoing(isOngoingNotif)
            .setAutoCancel(shouldAutoCancel)
            .setOnlyAlertOnce(shouldAlertOnce)
            .setContentIntent(pendingIntent)
            .build();

NotificationManagerCompat manager = NotificationManagerCompat.from(context);
manager.notify(MY_NOTIFICATION_ID, notif);

答案 1 :(得分:0)

在您的代码中,您正在使用"启动Intent"重新申请你的申请。你已经添加了" extras"到Intent,但他们永远不会被看到。

如果您的应用正在运行,但是在后台,并且您使用"启动Intent"来调用startActivity(),所有这一切都会将您的任务从后台带到前台。 它无法将Intent传递给Activity

A"启动Intent"与在HOME屏幕上按应用程序的应用程序图标时完全相同(如果它已在运行,但在后台运行)。这只会使现有任务处于当前状态,从背景到前台。

如果你想送货"额外费用"到你的应用程序,你不能使用"启动Intent"。您必须使用常规' Intent . Depending on your architecture, you could either start a new活动(which would get the "extras" in onCreate(), or you could start an existing活动(which would get the "extras" in onNewIntent()`。