【问题标题】:"smart" android activation from a push notification来自推送通知的“智能”android 激活
【发布时间】:2014-08-07 06:24:03
【问题描述】:

我有一个简单的任务 - 通过推送特定活动(而不是启动活动)激活应用

成像我在应用中有 3 个活动:

  1. A(飞溅)
  2. B(项目列表)
  3. C(所选项目详情)

一些先决条件:

  • 通过 push 我得到要选择的项目的 ID。
  • 在启动时,我正在强制进行身份验证。
  • 其中一个条件 - 例如,我无法将身份验证移动到另一个活动或应用程序服务。

现在我可以创建多个语句。当我点击推送激活应用程序时:

  1. 当推送到达时,PushIntentService 会生成一个通知,在 Intent extras 中指定项目 ID 如果应用程序被终止,我应该从活动 A 启动应用程序(强制身份验证)
  2. 如果应用在后台运行(在后台运行),我应该在同一个地方重新激活它(以跳过重新身份验证)
  3. 激活应用后,我将导航到 Activity C,其中项目 id 从 extras 中获取。

现在我正在使用以下代码生成通知(第 1 项,Xamarin.Android 语法):

var resultIntent = new Intent(Application.Context, typeof(SplashScreen));
resultIntent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop); 
if (extras.ContainsKey("ItemId"))
{
    var itemId = extras["ItemId"];
    resultIntent.PutExtra("ItemId", itemId);
}
var resultPendingIntent = PendingIntent.GetActivity(Application.Context, 0, resultIntent, 0);
builder.SetContentIntent(resultPendingIntent);
var notification = builder.Build();

此通知在所有情况下都可以正常工作,但我在这里看到了一个问题。 每次点击通知时,我都会从一开始就重新启动应用程序。 我想要的是当应用程序在后台运行时,我只需要激活它(就像 iOS 那样)并导航到所需的页面(更快地激活并避免重新验证)。

我怎样才能做到这一点并修改上面的代码?

【问题讨论】:

  • 根据我的想法,您需要使用标志,我的意思是当您的应用程序打开时,然后在应用程序关闭时使其为真,使其为假并将该标志保留在共享首选项中,这样当您收到通知时检查 flag 的值是否为真,如果为假则跳过该步骤,然后继续进行身份验证,其非常简单的逻辑希望它对您有用
  • 不幸的是,我必须在不检查应用程序是否正在运行的情况下做出决定。因为它可以在我们生成该通知时打开,它可以在我们生成之后和我们打开应用程序之前关闭

标签: android android-intent android-activity push-notification back-stack


【解决方案1】:

为此创建一个新的Activity。通知应该以Activity 开头(没有任何标志)。 在这个新的ActivityonCreate() 中,执行以下操作:

super.onCreate(...);
if (!isTaskRoot() && alreadyAuthenticated) {
    // Go directly to details page
    Intent redirectIntent = new Intent(this, Details.class)
    redirect.putExtra("id", itemId);
    startActivity(redirectIntent);
else {
    // This means the app was not running, so redirect to Splash
    Intent redirectIntent = new Intent(this, Splash.class)
    startActivity(redirectIntent);
}
finish();

如果用户单击Notification 时应用程序未运行,isTaskRoot() 将返回true。如果应用已经在运行,它应该返回false

要测试您是否已经通过身份验证,您可以调用static 方法或检查static 变量,或者您可能有其他方法来执行此操作。如果用户已经在“项目详细信息”或“项目列表”活动中,根据您希望 Activity 堆栈的外观,您可能希望在重定向到商品详情Activity.

希望你明白这一点。

【讨论】:

    【解决方案2】:

    我找到了关于如何模拟启动器图标点击意图的答案。我正在使用它为我的推送创建待处理的意图:

    var launchIntent = PackageManager.GetLaunchIntentForPackage(PackageName);

    这正是我想要的,在我的情况下它工作得很好。

    【讨论】:

    • 但是,如果应用程序已经在运行,这不会从通知中向应用程序传递任何额外内容(例如您的“id”)。它只会以应用程序进入后台时的任何状态将应用程序带到前台。那是你想要的吗?你的问题似乎表明你想要别的东西。
    猜你喜欢
    • 2023-03-06
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多