我正在编写本地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活动?
答案 0 :(得分:0)
上面问题中的代码实际上有效-并且确实将应用程序置于前台,而无需重新启动应用程序,从而保持其状态。
重新启动应用程序的原因,即使单击(手动)Nativescript应用程序图标也是如此。与开发环境有关。
当我在运行tns run android --bundle
的Mac上连接到Mac或在物理设备上运行应用程序时发生这种情况,或者
在模拟器中运行应用程序(通过运行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_CURRENT
或Intent.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);
希望如果遇到同样的问题,这对您有帮助。