Nativescript-如何在按下通知时将应用程序置于前台

时间:2019-05-31 09:01:47

标签: nativescript

我正在编写本地Android代码,以在按下通知时打开我的应用程序。如果该应用程序已经打开(无论是在前台还是在后台运行),我都希望单击通知以将该应用程序置于最前面,而无需重新启动它,以便保留其状态。

我尝试了以下代码(仅显示相关代码):



        ///////// Create an activity on tap (intent)
        const Intent = android.content.Intent;
        const PendingIntent = android.app.PendingIntent;
        // Create an explicit intent for an Activity in your app
        const intent = new Intent(context, com.tns.NativeScriptActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);


        const pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        ///////// Creating a notification 
        var NotificationCompat = android.support.v4.app.NotificationCompat;
        const builder = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(android.R.drawable.btn_star_big_on)
            .setContentTitle(title)
            .setContentText(message)
            .setStyle(
                new NotificationCompat.BigTextStyle()
                .bigText("By default, the notification's text content is truncated to fit one line.")
                )
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            // Set the intent that will fire when the user taps the notification
            .setContentIntent(pendingIntent)
            .setAutoCancel(true);

        ///////// Show the notification
        notificationManager.notify(NOTIFICATION_ID, builder.build());

但这打开了应用程序而不保留其状态。

遵循建议here,我还尝试模拟了按下启动器中的应用程序图标-这样,该应用程序才被带到前台,而不会重新创建Nativescript活动。

        const packageName = context.getPackageName();
        console.log('Package name: ',packageName);

        const emulateLaunchByAppIconIntent = context.getPackageManager()
            .getLaunchIntentForPackage(packageName)
            .setPackage(null)
            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

        const pendingIntent_emulated = PendingIntent.getActivity(context, 0, emulateLaunchByAppIconIntent, 0);


        ///////// Creating a notification 
        var NotificationCompat = android.support.v4.app.NotificationCompat;
        const builder = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(android.R.drawable.btn_star_big_on)
            .setContentTitle(title)
            .setContentText(message)
            .setStyle(
                new NotificationCompat.BigTextStyle()
                .bigText("By default, the notification's text content is truncated to fit one line.")
                )
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            // Set the intent that will fire when the user taps the notification
            .setContentIntent(pendingIntent_emulated)
            .setAutoCancel(true);

        ///////// Show the notification
        notificationManager.notify(NOTIFICATION_ID, builder.build());

这确实使该应用程序处于最前列,但没有保留其状态(即使该应用程序已经处于前台状态-它已重新加载该应用程序)。

然后,当应用程序刚刚发送到后台时,我尝试按了一个Nativescript应用程序应用程序图标-我发现它会重新启动应用程序,而不仅仅是将其带到前台。

我的问题是-为什么Nativescript应用程序的行为如此? 我该如何使Android仅使应用程序成为前台,而​​不重新构建新的nativescript活动?

1 个答案:

答案 0 :(得分:0)

上面问题中的代码实际上有效-并且确实将应用程序置于前台,而无需重新启动应用程序,从而保持其状态。

重新启动应用程序的原因,即使单击(手动)Nativescript应用程序图标也是如此。与开发环境有关。

  1. 当我在运行tns run android --bundle的Mac上连接到Mac或在物理设备上运行应用程序时发生这种情况,或者

  2. 在模拟器中运行应用程序(通过运行tns run android --bundle或直接从应用程序图标启动应用程序)

在未连接到nativescript开发环境的物理设备上运行该应用程序-显示了真实的行为-该应用程序被置于前台而无需在单击通知后重新启动。

有关代码示例的更多信息:

我发现不需要通过使用此代码模拟图标按下来启动应用

const emulateLaunchByAppIconIntent = context.getPackageManager()
   .getLaunchIntentForPackage(packageName)
   .setPackage(null)
   .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

const pendingIntent_emulated = PendingIntent.getActivity(context, 0, emulateLaunchByAppIconIntent, 0);

如以下代码中的PendingIntent.FLAG_UPDATE_CURRENTIntent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED所示,足以使应用程序出现在前台而无需在单击通知后重新启动:

const openActivityIntent = new Intent(context, com.tns.NativeScriptActivity.class);
openActivityIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
const openActivityPendingIntent = PendingIntent.getActivity(context, 0, openActivityIntent, 0);

///////// Creating a notification
const notificationManager = <NotificationManager> context.getSystemService(NotificationManager.class);
var NotificationCompat = android.support.v4.app.NotificationCompat;

const builder = new NotificationCompat.Builder(context, CHANNEL_ID)
    .setSound(soundUri)
    .setSmallIcon(android.R.drawable.ic_lock_idle_alarm)
    .setContentTitle(title)
    .setContentText(message)
    .setStyle(
        new NotificationCompat.BigTextStyle()
        .bigText('More explaination text if needed. Disabled for now.')
        )
    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
    // Set the intent that will fire when the user taps the notification
    .setContentIntent(openActivityPendingIntent)
    .setWhen(scheduledTime)
    .setAutoCancel(true)
    .build();


///////// Show the notification
notificationManager.notify(NOTIFICATION_ID, builder);

希望如果遇到同样的问题,这对您有帮助。