本文介绍了简历singleTask活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想恢复单任务活动,这样当用户单击我的通知出现在前台。 (同样的行为,如果用户拍了拍从应用程序菜单中的应用程序图标。)

I am trying to "resume" a single task activity so it appears in the foreground when a user clicks my notification. (Same behavior as if the user tapped on the app icon from the applications menu.)

我的通知,其创建播放由我的广播接收器接收到一个动作的PendingIntent。如果应用程序是不是在前台,我试图恢复应用程序。此外,我试图通过意图传递消息给我的onResume功能。不过,我打了一个错误:

My notification creates a PendingIntent which broadcasts an action that is received by my broadcast receiver. If the app is in not in the foreground, I try to resume the app. Additionally, I'm trying to pass a message to my onResume function through the intent. However, I'm hitting an error:

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

尽管这样的错误,我的应用程序正在恢复......不明白为什么。然而,我的演员不会被传递给我的onResume功能。

Despite this error, my app is being resumed...don't understand why. However, my extras are not being passed to my onResume function.

首先,我创建一个通知。

So first I create a notification.

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。

Which broadcasts "PleaseOpenApp" for 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
    }
  }
}

我的插件跟踪我们与否是在前台。此外,它试图让食我的接收器将尝试启动应用程序后。

My plugin keeps track of whether or not we're in the foreground. Also, it tries to get "food" after my receiver attempts to start the app.

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;
  }
}

注:因为我使用我的科尔多瓦活动有一个singleTask launchMode

另外,我是新来的Andr​​oid发展,使有关没有在前台VS恢复活动已遭到破坏,有关我不理解是$ AP一般概念/最佳实践信息恢复活动的任何帮助p $ pciated!

推荐答案

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

I don't think your Broadcast/Broadcast Receiver pattern is necessary.

意图可以用来直接启动一个活动,当你建立了意向,可以添加其它功能。然后,你的活动onResume()可直接提取它们。

Intents can be used to directly launch an activity, and when you build the Intent, you can add the extras. Then, your activity onResume() can extract them directly.

下面是一个简单的意向和建设的PendingIntent可在通知发出:

Here is a sample Intent and PendingIntent construction that can be sent in a notification:

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);

这篇关于简历singleTask活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-04 22:17