android 如何在点击通知时打开最后一个活动 [英] android How to open last activity when tapping notification

查看:29
本文介绍了android 如何在点击通知时打开最后一个活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我观察到了几个类似的问题,但他们帮不了我.当用户单击通知时,我需要显示最后一个活动.这是我的代码:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this).setContentTitle(getResources().getText(R.string.app_name)).setContentText(getServiceStateDescription(YourService.this)).setSmallIcon(iconId).setWhen(System.currentTimeMillis());意图 nIntent = getPreviousIntent();TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);//添加返回栈stackBuilder.addParentStack(MainActivity_.class);stackBuilder.addNextIntent(nIntent);PendingIntent pendingIntent =stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);notificationBuilder.setContentIntent(pendingIntent);startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, notificationBuilder.build());私人意图 getPreviousIntent() {意图 newIntent = null;最终 ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);如果 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {最终列表最近的TaskInfos = activityManager.getAppTasks();如果 (!recentTaskInfos.isEmpty()) {为(ActivityManager.AppTask appTaskTaskInfo:recentTaskInfos){如果 (appTaskTaskInfo.getTaskInfo().baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) {newIntent = appTaskTaskInfo.getTaskInfo().baseIntent;newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}}}} 别的 {最终列表最近任务信息 = activityManager.getRecentTasks(1024, 0);如果 (!recentTaskInfos.isEmpty()) {对于(ActivityManager.RecentTaskInfo最近任务信息:recentTaskInfos){if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) {newIntent = 最近的TaskInfo.baseIntent;newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}}}}if (newIntent == null) newIntent = new Intent();返回新的意图;

}

第二点是,如果我使用不推荐使用的方法来构建通知,那么显示最后一个活动效果很好,就像我想要的那样,这里是代码:

Notification note = new Notification(iconId,getResources().getText(R.string.serviceStarted),System.currentTimeMillis());note.flags |= Notification.FLAG_ONGOING_EVENT;note.flags |= Notification.FLAG_NO_CLEAR;Intent nIntent = new Intent();nIntent = getPreviousIntent(nIntent);PendingIntent pi = PendingIntent.getActivity(this, 0, nIntent, 0);note.setLatestEventInfo(this,getResources().getText(R.string.app_name), getServiceStateDescription(YourService.this), pi);startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID,注意);

但我不想再使用过时的方法了,这就是我在这里解释的原因.提前致谢!

我也看过这个文档.>

这是我的清单:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.VIBRATE"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/><uses-permission android:name="com.my.package.permission.C2D_MESSAGE"/><uses-permission android:name="android.permission.GET_TASKS"/><申请android:name=".MyApplication"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/Theme.AppCompat.Light"><activity android:name=".activity.StartingActivity_" android:label="@string/app_name"><意图过滤器><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></意图过滤器></活动><活动android:name=".activity.MainActivity_"android:configChanges="orientation|screenSize"></活动><活动android:name=".activity.ComposeEmailActivity_"android:configChanges="方向|屏幕尺寸"android:parentActivityName=".activity.MainActivity_"><元数据android:name="android.support.PARENT_ACTIVITY"android:value=".activity.MainActivity_"/></活动><活动android:name=".activity.EditAccountActivity_"android:configChanges="方向|屏幕尺寸"android:parentActivityName=".activity.MainActivity_"><元数据android:name="android.support.PARENT_ACTIVITY"android:value=".activity.MainActivity_"/></活动><!--android:process=":remote" 用于在后台工作--><service android:enabled="true" android:name=".service.YourService"/></应用程序>

解决方案

您的问题不在于您用于构建 Notification 的方法.您的问题是您对 TaskStackBuilder 的使用.使用这个类在幕后执行了很多隐藏的魔法,它对你希望应用程序的行为做出了很多假设.不幸的是,这些假设大多是错误的:-(

如果您只想将您的应用程序以它进入后台时的任何状态带到前台,您不想使用 TaskStakBuilder 并且您也不必使用所有那些讨厌的 ActivityManager 方法.只需这样做:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this).setContentTitle(getResources().getText(R.string.app_name)).setContentText(getServiceStateDescription(YourService.this)).setSmallIcon(iconId).setWhen(System.currentTimeMillis());意图 nIntent = getPackageManager().getLaunchIntentForPackage(ContextConstants.PACKAGE_NAME);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nIntent,PendingIntent.FLAG_UPDATE_CURRENT);notificationBuilder.setContentIntent(pendingIntent);startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID,NotificationBuilder.build());

I have observed several similar questions but they couldn`t help me. I need to display last activity when user click notification. Here is my code:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this)
        .setContentTitle(getResources().getText(R.string.app_name))
        .setContentText(getServiceStateDescription(YourService.this))
        .setSmallIcon(iconId)
        .setWhen(System.currentTimeMillis());

Intent nIntent = getPreviousIntent();
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(MainActivity_.class);
stackBuilder.addNextIntent(nIntent);
PendingIntent pendingIntent =
        stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingIntent);

startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, notificationBuilder.build());


private Intent getPreviousIntent() {
Intent newIntent = null;
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    final List<ActivityManager.AppTask> recentTaskInfos = activityManager.getAppTasks();
    if (!recentTaskInfos.isEmpty()) {
        for (ActivityManager.AppTask appTaskTaskInfo: recentTaskInfos) {
            if (appTaskTaskInfo.getTaskInfo().baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) {
                newIntent = appTaskTaskInfo.getTaskInfo().baseIntent;
                newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
        }
    }
} else {
    final List<ActivityManager.RecentTaskInfo> recentTaskInfos = activityManager.getRecentTasks(1024, 0);
    if (!recentTaskInfos.isEmpty()) {
        for (ActivityManager.RecentTaskInfo recentTaskInfo: recentTaskInfos) {
            if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) {
                newIntent = recentTaskInfo.baseIntent;
                newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
        }
    }
}
if (newIntent == null) newIntent = new Intent();
return newIntent;

}

Second point is that if i used deprecated metods in order to build notification, displaying last activity works great as i wanted here is code:

Notification note = new Notification(iconId,
            getResources().getText(R.string.serviceStarted),
            System.currentTimeMillis());
    note.flags |= Notification.FLAG_ONGOING_EVENT;
    note.flags |= Notification.FLAG_NO_CLEAR;

    Intent nIntent = new Intent();
    nIntent = getPreviousIntent(nIntent);
    PendingIntent pi = PendingIntent.getActivity(this, 0, nIntent, 0);
    note.setLatestEventInfo(this,
            getResources().getText(R.string.app_name), getServiceStateDescription(YourService.this), pi);

    startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, note);

But i don't want use deprecated metods anymore, that's why i'm here explaining. Thanks in advance!

And i've seen this doc as well.

Here is my manifest:

<?xml version="1.0" encoding="utf-8"?>

<permission android:name="com.my.package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.my.package.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.GET_TASKS"/>

<application
    android:name=".MyApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat.Light">
    <activity android:name=".activity.StartingActivity_"  android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".activity.MainActivity_"
        android:configChanges="orientation|screenSize">
    </activity>
    <activity
        android:name=".activity.ComposeEmailActivity_"
        android:configChanges="orientation|screenSize"
        android:parentActivityName=".activity.MainActivity_">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.MainActivity_" />
    </activity>
    <activity
        android:name=".activity.EditAccountActivity_"
        android:configChanges="orientation|screenSize"
        android:parentActivityName=".activity.MainActivity_">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.MainActivity_" />
    </activity>               

    <!--android:process=":remote" is for working in background-->
    <service android:enabled="true" android:name=".service.YourService"/>       

</application>

解决方案

Your problem isn't with the methods you are using to build the Notification. Your problem is your use of TaskStackBuilder. Using this class performs a lot of hidden magic behind the scenes and it makes a lot of assumptions about how your want the app to behave. Unfortunately, these assumptions are mostly wrong :-(

If you just want to bring your application to the foreground in whatever state it was in when it went to the background, you don't want to use TaskStakBuilder and you also don't have to use all those nasty ActivityManager methods. Just do this:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this)
    .setContentTitle(getResources().getText(R.string.app_name))
    .setContentText(getServiceStateDescription(YourService.this))
    .setSmallIcon(iconId)
    .setWhen(System.currentTimeMillis());

Intent nIntent = getPackageManager().
        getLaunchIntentForPackage(ContextConstants.PACKAGE_NAME);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nIntent,
    PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingIntent);

startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID,
    notificationBuilder.build());

这篇关于android 如何在点击通知时打开最后一个活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆