我正在开发一个用户可以登录登录活动的应用程序。登录用户可以在仪表板活动中查看他们的评论。如果服务器中有任何新的评论,它将推送通知。一切都运行得很完美除了一件事情,即当用户点击通知时,如果仪表板活动在前面,它每次都会打开一个新的仪表板活动。
我想要的是,如果用户点击通知,它将仅在应用程序未运行时打开仪表板活动。否则如果仪表板活动在前面,那么如果用户点击它,它将首先关闭仪表板活动,然后它将重新打开活动页面。 以下是我编写的用于执行仪表板活动的代码。
Intent startActivityIntent = new Intent(this, DashboardActivity.class);
startActivityIntent.putExtra("NotificationMessage", service_notification);
startActivityIntent.putExtra("flag", 1);
startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_NEW_TASK );
PendingIntent launchIntent = PendingIntent.getActivity(this, 0,
startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT);
earthquakeNotificationBuilder
.setContentIntent(launchIntent)
.setContentTitle(no_of_review + " " + "new review is there")
.setAutoCancel(true);
我尝试了很多但没有得到解决方案。谁能帮我?提前谢谢。
答案 0 :(得分:3)
和你的androidmanifest.xml中的android:launchMode="singleTask"
所以你可以和android:clearTaskOnLaunch="true
<activity
android:name=".DashboardActivity"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
答案 1 :(得分:1)
如果此代码打开,此代码将重新打开,否则app将重新开始
ActivityManager am = (ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
ActivityManager.RunningTaskInfo task = tasks.get(0); // get current task
ComponentName rootActivity = task.baseActivity;
Intent notificationIntent;
if(rootActivity.getPackageName().equalsIgnoreCase("your package name")){
//your app is open
// Now build an Intent that will bring this task to the front
notificationIntent = new Intent();
notificationIntent.setComponent(rootActivity);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
}
else
{
//your app is not open,start it by calling launcher activity
notificationIntent = new Intent(context, SplashActivity.class);
}
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent intent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
//use this pending intent in notification..
请参阅完整示例HERE ..
答案 2 :(得分:0)
您正在做的是每次用户点击通知时您都在创建新活动。现在您需要做的是将此FLAG_ACTIVITY_CLEAR_TOP添加到您的意图中,并在 ManifestFile 中更改您的活动的 launchmode 。同时覆盖 DashboardActivity
中的 OnNewIntent()方法以下是一些帮助您的代码
startActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
并像这样改变你的ManifestFile
<activity
android:name=".DashboardActivity"
android:launchMode="singleTop">
</activity>
然后在您的DashBoard活动中覆盖OnNewIntent方法,如下所示
@Override
protected void onNewIntent(Intent intent) {
DashboardActivity.this.finish();
// -----Start New Dashboard when notification is clicked----
Intent i = new Intent(DashboardActivity.this, DashboardActivity.class);
startActivity(i);
super.onNewIntent(intent);
}
只要您的活动存在且点击通知,就会触发OnNewIntent方法
如果您希望自己的活动在不同情况下表现不同,也请研究launchmodes。