点击notification把应用从后台放到前台
来源:互联网 发布:中国航空结算 知乎 编辑:程序博客网 时间:2024/05/16 15:06
问题描述:点击notification,我想把应用从后台弄到前台。但并不指定哪个具体的activity,而是显示应用在被放入后台时的activity?
“ Android Notification 的使用 ” 的时候,发现有几个问题,特别是设置Notification的Intent使之能够像 QQ 或其他程序一样能够正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例。当然重点便是如何设置该 Activity 的 launchMode 与 Intent 的 Flags 了,说到这里,我不得不说一下今晚的调试经历,当然这里所说的所有的Notification都设置了FLAG_ONGOING_EVENT。
按照 “ (转载)Android下Affinities和Task ”一文所说的,我们不难得出这样的结论:
1、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK ,而launchMode保持不变(即默认为:standard),则当用户用手点击Notification时,此时匹配到后台的Task,并把在堆栈中对应要启动的Activity之前的所有Activity全部清除掉,并且由于 standard 默认对于新的Intent总是创建新的Activity对象。因此存在于该Task中旧的Activity也会被清除掉,然后在该Task中创建新的 Activity对象。
2、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK,而launchMode设置为singleTop,则当用户用手点击Notification时,同1一样,只是存在于该Task中旧的Activity不会被清除掉,此时Intent传递给已经存在的Activity并不会创建新的Activity。
上面得出的结论,经过返回测试,1是正确的,2却存在着很莫名奇妙的问题
假设现在有个程序X,有2个Activity,分别是 A , B ,其中 A 是 设置了android.intent.action.MAIN的Activity(入口Activity),两者的launchMode都为默认的 standard,创建该Intent的代码如下:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
很明显我们设置的是当用户点击 Notification 时,应该出现的是 A Activity,但无论如何按home键退出当前Task,并使之成为后台Task,在从程序列表启动该程序总能恢复到Task顶端的Activity 给用户,如
当前 B,按home键,在从程序列表启动 X ,这个时候出现的Activity任然是 B,但按照如下的方法操作却会使得从程序列表启动 X,出现的是新创建的A Activity,其中经过Log打印得知下面的所有Activity都在同一个Task中
1、打开程序出现A,从A startActivity 到B,按Home键,点Notification出现A,再从A startActivity 到 B,按Home键,从程序列表打开程序 出现新创建的实例A
2、打开程序出现A,从A startActivity 到B,点Notification出现A,再从A startActivity 到B,按Home键,从程序列表打开程序也出现了新创建的实例A
这里所说的“新创建的实例A”都是创建在同一Task中的新的A Activity实例,也就是说按照以上两种方法,再按返回键,出现的则是 B,再按返回键出现的则是 A。这里我实在想不出为什么会在同一Task中创建一个新的Activity,就算从程序列表打开程序的Intent使用了 FLAG_ACTIVITY_NEW_TASK标记,我也不知道为什么,如果有朋友知道,一定要告诉我。
到这里,我开始发现 从程序列表启动 的优越性,因为不管是在什么时候按Home,再次从程序列表启动时,总能返回到Task的栈顶Activity。起初我想过一个办法,便是重载 Activity写一个类实现当onResume的时候更新Notification,然后我的所有Activity类都直接从该类继承,使得当按 Home 之后总能让Notification记住Task的栈顶Activity,就像QQ一样,但这种方法当然有点牵强,于是我开始看SDK 中 有关Home的Simple,终于发现了如果使用如下的Intent,便不会调用对应的Activity,而是调用Task中的栈顶Activity
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
除了 setClass 可以换成使用 setClassName 绑定,FLAG_ACTIVITY_RESET_TASK_IF_NEEDED可以不设,其他的选项都缺一不可。设置ACTION_MAIN与 CATEGORY_LAUNCHER是把该Intent发给了系统对应创建程序的模块,然后系统该模块根据设定的包与类信息还有flags进行处理。当然所有的Intent工作原理都是这样,只是对 ACTION_MAIN - CATEGORY_LAUNCHAR 的处理较为特殊,使得总是显示Task栈顶的Activity而不是setClass设定的Activity类。
按照 “ (转载)Android下Affinities和Task ”一文所说的,我们不难得出这样的结论:
1、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK ,而launchMode保持不变(即默认为:standard),则当用户用手点击Notification时,此时匹配到后台的Task,并把在堆栈中对应要启动的Activity之前的所有Activity全部清除掉,并且由于 standard 默认对于新的Intent总是创建新的Activity对象。因此存在于该Task中旧的Activity也会被清除掉,然后在该Task中创建新的 Activity对象。
2、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK,而launchMode设置为singleTop,则当用户用手点击Notification时,同1一样,只是存在于该Task中旧的Activity不会被清除掉,此时Intent传递给已经存在的Activity并不会创建新的Activity。
上面得出的结论,经过返回测试,1是正确的,2却存在着很莫名奇妙的问题
假设现在有个程序X,有2个Activity,分别是 A , B ,其中 A 是 设置了android.intent.action.MAIN的Activity(入口Activity),两者的launchMode都为默认的 standard,创建该Intent的代码如下:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
很明显我们设置的是当用户点击 Notification 时,应该出现的是 A Activity,但无论如何按home键退出当前Task,并使之成为后台Task,在从程序列表启动该程序总能恢复到Task顶端的Activity 给用户,如
当前 B,按home键,在从程序列表启动 X ,这个时候出现的Activity任然是 B,但按照如下的方法操作却会使得从程序列表启动 X,出现的是新创建的A Activity,其中经过Log打印得知下面的所有Activity都在同一个Task中
1、打开程序出现A,从A startActivity 到B,按Home键,点Notification出现A,再从A startActivity 到 B,按Home键,从程序列表打开程序 出现新创建的实例A
2、打开程序出现A,从A startActivity 到B,点Notification出现A,再从A startActivity 到B,按Home键,从程序列表打开程序也出现了新创建的实例A
这里所说的“新创建的实例A”都是创建在同一Task中的新的A Activity实例,也就是说按照以上两种方法,再按返回键,出现的则是 B,再按返回键出现的则是 A。这里我实在想不出为什么会在同一Task中创建一个新的Activity,就算从程序列表打开程序的Intent使用了 FLAG_ACTIVITY_NEW_TASK标记,我也不知道为什么,如果有朋友知道,一定要告诉我。
到这里,我开始发现 从程序列表启动 的优越性,因为不管是在什么时候按Home,再次从程序列表启动时,总能返回到Task的栈顶Activity。起初我想过一个办法,便是重载 Activity写一个类实现当onResume的时候更新Notification,然后我的所有Activity类都直接从该类继承,使得当按 Home 之后总能让Notification记住Task的栈顶Activity,就像QQ一样,但这种方法当然有点牵强,于是我开始看SDK 中 有关Home的Simple,终于发现了如果使用如下的Intent,便不会调用对应的Activity,而是调用Task中的栈顶Activity
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
除了 setClass 可以换成使用 setClassName 绑定,FLAG_ACTIVITY_RESET_TASK_IF_NEEDED可以不设,其他的选项都缺一不可。设置ACTION_MAIN与 CATEGORY_LAUNCHER是把该Intent发给了系统对应创建程序的模块,然后系统该模块根据设定的包与类信息还有flags进行处理。当然所有的Intent工作原理都是这样,只是对 ACTION_MAIN - CATEGORY_LAUNCHAR 的处理较为特殊,使得总是显示Task栈顶的Activity而不是setClass设定的Activity类。
Intent resultIntent = new Intent(Intent.ACTION_MAIN); // 启动栈顶的activity resultIntent.addCategory(Intent.CATEGORY_LAUNCHER); resultIntent.setClass(Utils.getContext(), MainActivity.class); resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); PendingIntent resultPendingIntent = PendingIntent.getActivity( Utils.getContext(), 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT ); Notification notify = new Notification.Builder(Utils.getContext()) // 设置打开该通知,该通知自动消失 .setAutoCancel(true) // 设置显示在状态栏的通知提示信息 // 设置通知的图标 .setSmallIcon(R.mipmap.logo) // 设置通知内容的标题 .setContentTitle(title) // 设置通知内容 .setContentText(content) // // 设置使用系统默认的声音、默认LED灯 .setDefaults(Notification.DEFAULT_SOUND) // |Notification.DEFAULT_LIGHTS) // 设置通知的自定义声音// .setSound(Uri.parse("android.resource://cn.notificationtest.com/"+R.raw.msg))// .setWhen(System.currentTimeMillis()) // 设改通知将要启动程序的Intent .setContentIntent(resultPendingIntent).getNotification(); // 发送通知 NotificationManager mgr = (NotificationManager) Utils.getContext().getSystemService(Utils.getContext().NOTIFICATION_SERVICE); mgr.notify(++notidy_id, notify);
阅读全文
0 0
- 点击notification把应用从后台放到前台
- 点击notification把应用从后台放到前台
- 如何把android后台应用调到前台
- java把List从后台传到前台jsp页面
- Linux-把任务放到后台
- Android判断应用是否是从后台回到前台
- Android 实现监听应用从后台回到前台
- Android 从后台进入前台
- freemarker把从后台传来的uct时间格式化展现到前台
- 收到通知后启动应用或将应用从后台恢复到前台
- 把后台窗口调至前台显示
- Linux把应用图标放到桌面上
- 返回键使程序后台,使用notification进入前台
- linux让命令后台运行,从台运行到前台运行,以及nohup命令的应用
- 安卓应用每次从后台切换到前台都会启动欢迎界面的问题
- Android应用从后台切换到前台因为数据被GC报异常
- Android应用从后台切换到前台因为数据被GC报异常
- 应用从后台切换到前台时,默认跳转到主页的问题
- xml是什么意思
- sql server进行分页后的复选框的勾选不消失
- leetcode[Ransom Note]//待整理多种解法
- 关于华为手机读取SD卡权限没用记录一下
- 华为手机在开发中遇到的第一次安装过后按home键退出后台,在次点击图标进入的时候会再次走闪屏页的问题
- 点击notification把应用从后台放到前台
- 机器学习笔记二十四 中文分词资料整理
- HDU 2665 Kth number [可持久化线段树 主席树]
- 多线程论述
- 初步使用shell
- 深入剖析Android音频之AudioTrack
- 移动端字体选择
- C语言中实现可变参数函数
- python正则表达式