安卓中软件被杀死之后再次mac打开安卓软件,退出时要退出多次

帖子很冷清,卤煮很失落!求安慰
手机签到经验翻倍!快来扫一扫!
关掉所有手机后台程序科学吗?带你真正认识安卓手机的运行内存RAM~
22774浏览 / 17回复
九进九出 把此帖设为精华,作者+50经验:
& & & 最近总有人问我,自己手机内存占用率很高是为什么,1G内存,实际可用800M,经常占用600M以上,我一般都会先问问:那你的手机卡吗?经过自己的一番研究和在网上找了一些资料,总结了一些个人的简介,和大家讨论讨论,欢迎大家的实际使用案例分享出来~  当一个程序放到后台时,系统可能将数据保存起来而让程序进行休眠,或者仅仅运行部分服务,仅仅当收到相关的申请时才恢复部分进程,处理完之后结束进程而保留服务——这些都是自动处理的,也就是说,如果用户运行的软件都是按照Android思想而设计的,那么除了明确有退出按键的一部分大型程序外,其他程序是都可以运行后扔到后台不用再管了的,当某个程序需要更多RAM时,系统会自动释放掉一些不重要且最近没有使用的程序;而当你打开某个曾经打开的程序时,系统会先检查RAM里是不是有这个程序的部分进程,然后进行恢复,这样可以更快打开它。& & & 举个最简单的例子:加入你的安卓手机安装了一些第三方的桌面插件,当你再运行一键杀后台进程的时候有很大的可能导致桌面程序被杀,结果手机顿时卡的无法正常运行甚至报错!  当然了,如果智能本身RAM很小而且不给力,系统自然会很频繁的终止进程释放,这就使得许多小内存的手机用起来感觉一卡一卡的了。于是很多论坛都开始讨论怎么样使得全杀过后空闲内存更大、怎样禁止自动启动某些进程——结果空闲RAM确实大了,用起来反而更卡了——随便切换个程序(如看书的时候来了个电话)系统都要重新启动几乎所有相关的进程,怎么能反应不迟钝。&&  & & &Android用RAM的方式,跟Windows、Windows Phone、Symbian是两回事。在Android里,RAM被用满了是件好事。它意味着你可以快速打开之前打开的软件,回到之前的位置。所以Android很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的手机。而实际上,退出后重启这些程序才真正拖慢了手机的响应。而且这些自动杀进程的软件本身是个时刻活跃的进程,它始终在后台保持活跃使得CPU难以消停,反而增加了耗电量。  这个问题最终我觉得应该埋怨程序员。许多国内的Android程序员编写的程序根本就没有对进程进行分类,总是试图将所有进程都保留在内存里(例如某著名手机浏览器)!这就使得这些程序即使放到后台了,它也不许系统对其进程进行释放。WM、Sybiam系统里的内存管理没有这么智能,于是习惯了这种方法的程序员以及用户就把这种内存管理方式和使用习惯用到了Android上。所以这里建议,对于很多国内软件,用完之后还是按一下退出吧,而对于规范化的程序,以及系统自带的那些程序(例如谷歌程序基本都没有退出),用过之后放后台就好。但是良好的手机使用习惯还是要保持的,就比如说不用的程序及时关掉,当然这和上边我说的那点实际上是不矛盾的:比如一些游戏程序,浏览器之类的在使用结束后完全是可以关闭的,这样既腾出了内存也会降低耗电量,我还在网上搜集了一些良好的安卓手机使用习惯,也一并分享给大家:在了解了Android手机的基本信息后,本文我们为大家在使用Android手机过程中,需要注意那些地方,养成良好的使用习惯。1、安装的应用够用就好,如果你不是玩机发烧友,装几个必备的应用和一些自己需要的应用即可,无需安装过多的程序,否则会导致手机变慢,尤其是一些内存较小的机型。2、应用安装较多的时候,适当的进行删减,对于不常用,或是安装后觉得没用的软件要及时卸载,以免占用手机空间,影响手机的使用。3、养成按“返回键”或是程序自带的退出功能来退出应用的好习惯,如果不是为了要将程序切换至后台运行,就不要使用“房子键”退出,按“房子键”是将程序切至后台运行,并没有真正的退出,而按“返回键”或是通过软件的退出功能退出才是正在完全退出程序。4、使用任务管理功能,结束一些后台不用的程序或服务,来释放更多的内存,提高手机运行速度。5、如果您的手机硬件配置不是很好,可以适当的关闭手机中的一些窗口动画特效,来提高手机的运行和操作速度。6、定期清理手机中的缓存垃圾,释放更多的手机空间,换手机一个健康绿色的运行环境。7、如蓝牙,wifi,同步,GPS等这类的功能开关,如果不是经常使用,可以考虑关闭它们,用到时再开启,这样可以节约更多的电量,获取更多的待机时间。8、通过开机优化功能,查看一些开机启动项目,无需开机使用的应用就将其禁止,以免开机后消耗过多的资源。9、如果对手机不是特别了解,不要随意乱安装一些高级软件使用,如:需要root权限,或是可以修改系统功能的一些应用,此类程序可能会因为操作不当,出现一些未知问题。10、如果手机出现了未知问题,或是经过长时间使用导致系统缓慢不稳定,可以在设置──隐私设置中选择恢复出厂设置,来实现清空所有数据、恢复初始状态。注意,进行该操作前记得备份一下手机中的重要内容。相关内容推荐:扒一扒日常使用时候的十大坏习惯 帮你改掉使用手机的十大坏习惯
不错,不错,支持!~!~!
楼主纯扯淡
说的好像有点道理
说的好像有点道理
说的好像有点道理
我也遇到过关闭程序后桌面无响应诶
简单清楚明了!感谢楼主!一些带自启动而又必须后台运行的软件确实没必要列入查杀行列,弄得手机不停的处于工作状态,其实智能手机就是需要人去运用软件管理软件才能是手机高效运行并提高优良的续航能力!
对 楼主 破碎の梦 说:=========================说得很好
不科学,我设置了启动不了,只能刷机
spud0503 发表于
简单清楚明了!感谢楼主!一些带自启动而又必须后台运行的软件确实没必要列入查杀行列,弄得手机不停的处于...
智能机经常被人为操作,到底是人智能还是手机的智能,你的话让我受教!
您需要登录后才可以回帖&&&|&&&&&
用户名/注册邮箱/注册手机号
其他第三方号登录Android应用程序需不需要手动退出?
不止一次,也不止一个人问过这个问题。我都回答了:不需要。但是,还是要记录下来。
我们不妨从了解这个系统对于应用程序管理的一些内部机制开始说明原因。
对于Android系统而言,包含”进程”和”服务”。”进程”有正在运行的,也有刚刚离开在后台缓存的。”服务”是一个无界面、长时间运行的应用功能,并且不会轻易被终止。
我们知道,在Android中可以快速通过主页键(home)或者使用返回键(←)逐步离开应用程序。
在当前运行的应用程序的任意界面,按下主页键会快速回到手机主屏幕。同时这个应用程序的进程将在后台被暂停并建立缓存,再次启动应用程序时可以方便地返回刚才的界面。(现场被保留)
当然,在你按下主页键回到手机主屏幕时,因设计需要,也有可能会在后台运行一个甚至多个进程和服务,以保证这个应用程序在后台是”活的”。(比如音乐正在播放时)
尽管我们知道了后台会产生各种各样的”进程”与”服务”,但你并不用担心它们会把你的手机拖累。当运行新的应用程序发现内存可能不够用时,系统会自动在后台释放部分缓存在后台的进程,以保障可运行新的应用程序。这是一个智能的、良性的供给体系。
Android系统使用返回键来进行屏幕后退,以及关闭对话框/菜单/屏幕键盘。
对于传统的本地客户端应用程序,每个屏幕可以理解为一个活动(Activity)。通过返回键可以快速回退到当前应用程序的上一个活动,也可以离开当前应用程序打开的新的应用程序的某个活动。
所有的活动呈堆栈结构(一种串行形式的数据结构),正在运行的活动处在最顶端。当你按下返回键,会清除当前活动并恢复上一个活动。如下面的【图1】示例:
【图1】(来源:/guide/topics/fundamentals/tasks-and-back-stack.html )
如果你连续按返回键,活动一个个被抽离,就像剥洋葱一样。
在Android的应用程序里,可以通过”意图(Intent)”功能,在当前应用程序(任务)的某个活动来启动另一个应用程序(任务)的某个活动。
比如下面的【图2】的示例,在”有道词典”主界面单击超链接”意见反馈”打开浏览器访问目标网页:
在目标网页界面,你可以使用返回键快速返回刚才的”有道词典”主界面。
而接下来这个例子,体验则是非常糟糕的:
请看【图3】,在目标网页想要返回上一个任务需要历经几番周折。一遍又一遍地回退浏览器的浏览历史,甚至还要回到浏览器的起始页,然后弹出一个对话框询问是否要退出。天哪!我快要疯掉了。
Android官方对于多个任务间的活动堆栈处理机制,可以看下面的【图4】来解释:
【图4】(来源:/guide/topics/fundamentals/tasks-and-back-stack.html )
从图中我们可以看到,一开始在后台的”任务B”的”活动Y”经由”任务A”的”活动2″的一个按钮抽调到了前台,而随着”任务B”的活动一个个被剥离,最终整个”任务B”被结束了,并且使用返回键又回到了”任务A”的”活动2″。
当然,应用程序可以决定被调用时在哪一个活动就要结束。比如【图4】的”任务B”被”任务A”的”活动 2″抽调到前台后,可以决定在”活动 Y”这里就为终点,而不需让用户经过”活动 Y”的上一层”活动 X”。否则,就会出现像【图3】那样的麻烦,用户被不情愿地经过与当前任务无关的其它活动。
返回键实现了调用新任务之后快速返回的便利,而不是只能迂回地回到应用程序列表并找到上一个使用的应用程序再次启动。
当所有活动从堆栈中清除,任务结束。也就是说,在应用程序的主界面按下返回键,应用程序就已经退出了。
除非,这个应用程序设计了后台运行的进程和服务。比如”新浪微博”,即使你在应用程序主界面按下返回键退出了,在”程序管理”&”正在运行”界面上仍然可以看到正在运行的进程和服务。(需通过菜单键切换至”显示当前运行的服务”视图)
正如上面提到的,后台服务是一个无界面、长时间运行的应用功能,并且不会轻易被终止。即便你使用第三方的”任务管理器”来结束进程和服务,也有可能会自动重启进程和服务。(其实可以在”服务”界面找到它并且手动停止服务,只不过没有这个必要性,交给系统自动处理即可。)
至此,我们已经知道Android应用程序为什么不需要手动退出了。因为聪明的系统已经帮助用户做了许多事情,包括退出应用程序以及恢复可用内存。
受限于Android官方对设计规范的态度,Android并没有像iOS那样明文告诉设计者不需要这个不需要那个。Android应用程序的设计模式也因此而”百花齐放”,很难形成较为统一的体验。比如本文提到的需不需要手动退出Android应用程序的话题,如果在iOS中看到屏幕上有退出应用程序的按钮,是一件搞笑的事情。
无论如何,Android也好iOS也罢,用户本来就不需要关注”进程”或”内存管理”、”任务管理”这些东西。用完,离开界面即可,就这么简单!把用户不需要关注的问题抛给用户,无异于”不想让小孩玩火,但是又给他一个打火机。”
设计师们,该做些什么了。改变吧!
看到这里,也许你会问:既然Android应用程序在后台被挂起暂停了,但是为何开多了应用程序手机还是会变慢呢?
一方面:新运行的应用程序如果需要较大的内存,自然会比较慢。另外,如果手机本身的内存过小且CPU不给力,系统自然会因较频繁地自动结束进程释放缓存而导致手机在某些时候运行比较慢的感觉。
也正因为这样,我们知道了为什么”任务管理器”会如此流行,甚至成了”装机必备”。人们用它来快速提前释放缓存以保证运行新应用程序时有足够的内存。当然,随着CPU频率越来越高,内存越来越大的发展趋势,手动清除缓存已经慢慢变得不再需要。
另一方面:临时启动的后台服务可能会导致手机变慢。有些应用程序在后台监听到指定的事件会自动启动,比如操作系统本身的”Google服务”,又比如连接USB并且在PC上启动”豌豆荚手机精灵”,手机上的”豌豆荚守护精灵”会自动启动。为了避免这种情况,只能建议你有选择性的安装应用程序了。聪明的软件需要先进的硬件来支持。
也许你又会问:既然在应用程序主界面用返回键可以直接退出应用程序,可是为什么某Android应用程序(尤其是国内的)要弹出退出确认对话框呢?
往往他们会说是为了防止用户误操作,但完全是多余的考虑,因为有足够的恢复保障。背后真正的原因其实是产品人不希望自己的应用程序太容易被用户”退出”,为此给用户增加一道障碍墙。担心误操作,在我看来都是借口。
瞧瞧我们眼前的PC软件吧!单击窗口右上角的 X 图标后,也有不少软件在干同样的事情呢。
毫不客气地说,这是典型的把责任推卸给用户的做法。似乎在警告用户:”真的要退出了?确定的话我就不管你了!”
我们应该尽可能少使用对话框,提供必要的容错支持。允许用户犯错,并给予恢复的机会。比如你可以允许用户在按下返回键离开应用程序后还能再次返回现场。这在很多优秀的第三方应用程序上均有体现,比如Twitter、米聊……
当然,沉浸式的应用程序除外。比如影片正在播放或者游戏正在进行的画面,应当尽可能地不要让用户犯错被退出。沉浸式的应用程序应当提供沉浸式的体验保障,因为游戏或影片进行到一半被退出往往是无法返回现场的。
最后,补充说明:本文所说的”退出”是指退出应用程序,而不是指退出帐户的登录状态。如果你的应用程序是需要用户使用帐号密码登录的,那么提供”退出登录”(或叫”注销”)的功能,是有必要的。
1:也许你会问:既然在应用程序主界面用返回键可以直接退出应用程序,可是为什么某Android应用程序(尤其是国内的)要弹出退出确认对话框呢? 真正的原因其实是产品人不希望自己的应用程序太容易被用户”退出”。————–差矣!哪个产品人,都不希望产品被退出。我倒觉得没有设置退出确认的比设置了的更不希望用户退出。因为这样一来用户找不到退出的地方时(从任务管理器中断程序的除外),会一直停留在程序的使用上,只不过有些在后台,有些在前面而已。所以比起设置了退出确认的,你认为哪个产品人更流氓。
ok,你说允许用户犯错,并给予恢复的机会。比如你可以允许用户在按下返回键离开应用程序后还能再次返回现场。———为什么退出就不能返回现场了呢?如果你不能返回,是否可以说明你的界面下的功能还不够强大。输入关键字或相关内容进行搜索
注册返回按键的事件,自行处理逻辑。http://www.html5plus.org/#specification#/specification/Key.html也可以参考看Hello H5+的源码。
我注册了监听返回键,弹出confirm()由用户确认是否退出,可是点击了取消也会退出应用啊,这是怎么回事啊?plus.key.addEventListener('backbutton', function() {
if(confirm('确认退出本应用?')){
plus.runtime.quit();
同问,再次问,我也是这样的?
在mui.js 里有监听
右滑 和退后键都被监听了,1.减除监听,没测试过,但应该可以,
2. 注释掉mui.js里 backbutton 和 右滑键监听里的 $.back();就是这个影响直接退出的。如果有可能,请mui内部优化下, 当后退时没有窗口 弹出是否退出,右滑则像右滑菜单一样,需要滑到左侧才关闭,而不是右滑直接关闭
若使用了mui,则不能简单的addEventlistener,而要重写mui.back;因为若addEventListener的话,还会继续执行mui.back(默认关闭或隐藏);
关于重写mui.back的方法,参考:章节
我还没编译,也有这问题,默认就挺好,案例也是物理返回键 返回上一页,没有才提示,再点击才退出。如果是bug,请修复
要回复问题请先或
浏览: 6318
关注: 8 人教你正确的关闭安卓进程的方法_安卓教程_好卓网
教你正确的关闭安卓进程的方法
安卓进程机制管理
  很多使用安卓手机的朋友经常会时不时的杀进程,以为这样就可以让手机运行更顺畅了也更省电了,但是这种做法真的正确吗?这里我们先来说说安卓的进程管理机制吧,安卓的进程管理机制是事件触发式 比如开机时、开机后、网络连接更改、电量不足、电量充足、时间更改、插上电源等等这些状态的改变都可看作一个事件,安卓系统允许程序关联这些事件设定,比如关联开机后,差不多就相当于我们一般说的开机启动了。但是安卓系统可以允许一个程序关联多个事件,拿谷歌地图来说吧,它关联的事件有&开机后、电量不足、电量充足、安装应用程序、卸载应用程序、更新应用程序、插上电源&等等。。。中间任何一个状态改变,系统都会自动运行谷歌地图进入后台,你说任务管理器得多少次才能完全结束呢 ?
  安卓为什么要这样做呢 其实这样做的目的是为了提高程序运行的效率。举例来说,当你打开WIFI时,肯定要上网,系统就会调入一些上网的关联程序进入后台休眠V徽加媚诖妫不占用CPU资源ぃ当你真正需要运行这些程序的时候,系统直接把程序从后台转到前台运行,这样大大提高了程序的运行效率,我觉得这也是统筹方法的一种应用吧。至于说会不会软件一直启动会把内存占满,这个不用担心,当系统内存低于某个值时,内存管理机制会根据进程的优先级来关闭后台进程。但是呢,在硬件配置飞速发展的今天,像小米手机,即便是一步步加载程序也是秒速来算的,所以这个运行效率也没有得到多大的体现。鉴于一些软件进入后台不只是休眠,可能会有些费电,所以我们不如把这个事件触发的关联切断。怎么切断 ?
  给大家推荐一个软件,Autostarts启动项管理 这个软件就是针对这个而生的,它只做这个,做完退出,不会像其他进程管理一样常驻内存。该软件不需要常驻内存,运行一次设置好后,切断与应用程序触发关联就可以退出了。打开来,里面有按事件分组,一个事件下面列出所有关联这个事件的所有程序。如果按程序分组,一个程序下面列出这个程序关联了哪些事件,你把觉得没有必要关联的事件触发禁用掉就好了。如果禁用掉之后,这个程序还会自动运行,你可以再次打开Autostarts,按菜单键&查看,把隐藏未知事件取消勾选,可能这个程序关联了Autostarts搞不明白的事件,如果有,禁用之。
  注意:搞这个是有风险,黄色的显示是系统进程,禁用的时候会有提示,如果你没有把握就留着。不过也不要太担心,如果禁用错了导致某个功能无法使用,启用就可以了。另外程序重新安装或者作了升级,会重建事件触发关联,要重新运行Autostarts切断它。
  其实安卓的进程机制是很复杂的,前台进程foreground,可见进程visible,次要服务secondaryserver,后台进程hidden,空进程empty,至于他们究竟运作,我们没有必要太了解,知道个大概就好了。 像自带的任务管理器还要不要用呢,可以用,因为某些程序你打开后不能完全退出,需要用那个来结束。运行大的游戏之前最好释放一下内存。 其他大部分的所谓进程管理软件,往往需要常驻内存,等进程运行就把进程杀掉,还美其名曰自动杀进程,其实傻得可爱。
分享到其他平台:
从低端到高端,三星所出产的手机可谓说是很多的。近日,三星另外一款超豪华翻盖手机三星GALAXY Golden 3将在中国市场首发,据悉,这款手机上市之后,售价将会超过万元。
10月21日最新消息,大家期待已久的HTC One A9今天已经正式发布了。据悉,HTC One A9发布之后,将会在11月份的第一周正式上市开卖,届时大家可以在HTC官网,以及其他线上途径进行购买。
随着手机上装的资料越来越多,内存卡的容量也越发不可忽视,在购买手机内存卡的时候大家经常会问什么牌子的手机内存卡好,下面小编就为大家介绍一下当下内存卡市场格局。
发现手机内存卡无法格式化之后,许多人认为这张卡就报废了,其实既然电脑还能读取到这张卡,那我们还是能抢救一下的,下面就教大家手机内存卡格式化不了的解决方法。
一、ROM 特色 1. 应群机友的建议和帮助,保持官方原貌下增添部分实用APP编译,精致精简714M、【如果喜欢长期使用又简单的机油可以尝试下】 2. 官方10.5.A.0.233最终版本内核基带 3. 增加
一、ROM 特色 1. 移植Z3的有声照片 2. 移植Z3的的AR趣拍 3. 移植Z3的动态镜头 4. 移植Z3的最新相册 5. 移植Z3的超逼真 6. 移植Z3的XReality 7. 移植Z3的媒体声音 8. 移植Z3的主题和壁纸 9. 移植Z3的
装机必备软件
装机必备游戏Android实现点击通知栏后,先启动应用再打开目标Activity - 简书
Android实现点击通知栏后,先启动应用再打开目标Activity
在开发Android app的过程中,遇到这样一个需求:app中启动一个Service,该Service在独立进程中运行,与服务器保持长连接,将服务器推送过来的消息在通知栏中显示,并设置点击动作,点击后跳转到app中对应的Activity。目前遇到的问题是Service以独立进程运行,在收到消息并弹出通知后,app本身的进程有两种情况:
app正在运行
对于第一种情况,处理就非常简单了,直接将参数传入Intent并打开对应的Activity即可。
但第二种情况比较复杂,因为app已经退出,而要打开的Activity中的某些操作是需要依赖app的初始化的,这些初始化操作是在app启动过程中进行的。举个例子,一个购物应用推送了某个新商品的消息,用户点击通知后进入商品详情的Activity,而该Activity中有个订购Button,点击该Button后就会从本地中获取用户的Id等信息并发一条消息给服务器,告诉服务器某用户订购了该商品。这些用户信息是在app启动时与服务器进行一系列交互后取得的。如果app退出后直接进入详情Activity并点击购买,就会因为获取不到用户信息而出错。
所以目前要解决的问题时,在Notification中设置点击动作,如果app本身正在运行,直接跳转到目标Activity;如果app已经退出,先启动app完成初始化,再跳转到目标Activity。
方案和思路
我们假设目前有三个Activity:
SplashActivity 用于显示app大图,同时进行用户登录等操作,服务器返回数据后跳转到MainActivity。
MainActivity app的主Activity。
DetailActivity MainActivity中点击Button进入的Activity,用于显示某件商品详情。
而弹出通知的Service在另外一个进程中。
我们要达到的目的是:
点击通知栏通知,假如app正在运行,则直接跳转到DetailActivity显示具体内容,在DetailActivity中按Back键返回MainActivity
点击通知栏通知,假如app已经退出,先从SplashActivity进入,显示app启动界面,初始化操作完成后进入MainActivity再跳转到DetailActivity显示具体内容,在DetailActivity中按Back键返回MainActivity。
初步的思路是先判断app进程是否存在,如果存在的话,就利用startActivities启动MainActivity和DetailActivity。为什么还要启动MainActivity而不直接只启动DetailActivity?因为有如下情况,进程中的所有Activity都已经退出了,但进程还没有被系统回收,这时判断进程是否存在返回true,然后只启动DetailActivity的话,按Back键任务栈就直接到底,返回桌面了。而我们要的效果是按Back键返回上一级Activity,也就是MainActivity。
如果app进程已经退出,不存在了,此时就用一个Intent启动应用,该Intent中包含一个Bundle, Bundle中存有启动DetailActivity所需的参数,这个Intent传入SplashActivity后,再由SplashActivity传给MainActivity,在MainActivity中加入判断,如果有该参数,则表示应用是从通知栏启动的,要进行跳转到DetailActivity的操作,否则就是常规启动。
有了大概的实现思路后,大家来个demo实际操作一下。首先,我们的demo有简单的组件:
PushService,在新进程中启动的Service,负责监听服务器,收到服务器的信息后将消息广播出去,在本demo中,为了简化,只是简单的广播一个消息
ShowNotificationReceiver,在新进程中注册的BroadcastReceiver,收到PushService发的消息后,会在通知栏弹出通知
NotificationReceiver, 在新进程中注册的BroadcastReceiver,用来设置点击通知栏通知的动作,打开app中的某个Activity
SplashActivity, app启动页面,先是启动图片,3s后进入MainActivity
MainActivity,app的主Activity
DetailActivity,app中显示详情的Activity
PushService.java
首先是PushService,要在新进程中启动,要在AndroidManifest.xml中加入以下注册Service的代码
&service android:name=".PushService"
android:process=":push"/&
PushService的工作很简单,启动后发一个广播在通知栏显示通知,然后常驻在后台
public class PushService extends Service{
public IBinder onBind(Intent intent) {
public void onCreate() {
super.onCreate();
Log.i("PushService", "PushService onCreate");
//用AlarmManager定时发送广播
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, ShowNotificationReceiver.class);
PendingIntent pendingIntent =
PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.currentThreadTimeMillis(), pendingIntent);
ShowNotificationReceiver.java
这个广播类用来在通知栏弹出通知
public class ShowNotificationReceiver extends BroadcastReceiver{
private static final String TAG = "RepeatReceiver";
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "ShowNotificationReceiver onReceive");
//设置点击通知栏的动作为启动另外一个广播
Intent broadcastIntent = new Intent(context, NotificationReceiver.class);
PendingIntent pendingIntent = PendingIntent.
getBroadcast(context, 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentTitle("这就是通知的头")
.setTicker("这是通知的ticker")
.setContentIntent(pendingIntent)
.setSmallIcon(android.R.drawable.ic_lock_idle_charging);
Log.i("repeat", "showNotification");
NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(2, builder.build());
NotificationReceiver.java
点击通知栏后,会发送一个广播,NotificationReceiver收到该广播后,就会判断,app进程是否仍然存活,根据app进程的不同状态,定义不同的app启动方式
public class NotificationReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
//判断app进程是否存活
if(SystemUtils.isAppAlive(context, "com.liangzili.notificationlaunch")){
//如果存活的话,就直接启动DetailActivity,但要考虑一种情况,就是app的进程虽然仍然在
//但Task栈已经空了,比如用户点击Back键退出应用,但进程还没有被系统回收,如果直接启动
//DetailActivity,再按Back键就不会返回MainActivity了。所以在启动
//DetailActivity前,要先启动MainActivity。
Log.i("NotificationReceiver", "the app process is alive");
Intent mainIntent = new Intent(context, MainActivity.class);
//将MainAtivity的launchMode设置成SingleTask, 或者在下面flag中加上Intent.FLAG_CLEAR_TOP,
//如果Task栈中有MainActivity的实例,就会把它移到栈顶,把在它之上的Activity都清理出栈,
//如果Task栈不存在MainActivity实例,则在栈顶创建
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent detailIntent = new Intent(context, DetailActivity.class);
detailIntent.putExtra("name", "电饭锅");
detailIntent.putExtra("price", "58元");
detailIntent.putExtra("detail", "这是一个好锅, 这是app进程存在,直接启动Activity的");
Intent[] intents = {mainIntent, detailIntent};
context.startActivities(intents);
//如果app进程已经被杀死,先重新启动app,将DetailActivity的启动参数传入Intent中,参数经过
//SplashActivity传入MainActivity,此时app的初始化已经完成,在MainActivity中就可以根据传入
//参数跳转到DetailActivity中去了
Log.i("NotificationReceiver", "the app process is dead");
Intent launchIntent = context.getPackageManager().
getLaunchIntentForPackage("com.liangzili.notificationlaunch");
launchIntent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
Bundle args = new Bundle();
args.putString("name", "电饭锅");
args.putString("price", "58元");
args.putString("detail", "这是一个好锅, 这是app进程不存在,先启动应用再启动Activity的");
launchIntent.putExtra(Constants.EXTRA_BUNDLE, args);
context.startActivity(launchIntent);
SplashActivity.java
SplashActivity.java先是app启动的图片,3s后进入MainActivity, 如果启动SplashActivity的Intent中带有参数,就将参数取出,放入启动MainActivity的Intent中
public class SplashActivity extends AppCompatActivity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
//隐藏ActionBar
getSupportActionBar().hide();
//使用handler倒数3秒后进入MainActivity
new Handler().postDelayed(new Runnable() {
public void run() {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
//如果启动app的Intent中带有额外的参数,表明app是从点击通知栏的动作中启动的
//将参数取出,传递到MainActivity中
if(getIntent().getBundleExtra(Constants.EXTRA_BUNDLE) != null){
intent.putExtra(Constants.EXTRA_BUNDLE,
getIntent().getBundleExtra(Constants.EXTRA_BUNDLE));
startActivity(intent);
MainActivity.java
MainActivity中,如果有参数传入,就在初始化结束后,根据参数启动DetailActivity,如果没有参数传入,就此结束自己的任务
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, PushService.class);
startService(intent);
setTitle("MainActivity");
Bundle bundle = getIntent().getBundleExtra(Constants.EXTRA_BUNDLE);
if(bundle != null){
//如果bundle存在,取出其中的参数,启动DetailActivity
String name = bundle.getString("name");
String price = bundle.getString("price");
String detail = bundle.getString("detail");
SystemUtils.startDetailActivity(this, name, price, detail);
Log.i(TAG, "launchParam exists, redirect to DetailActivity");
protected void onResume() {
super.onResume();
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return super.onOptionsItemSelected(item);
DetailActivity.java
比较简单,显示传入的参数即可:-D
public class DetailActivity extends AppCompatActivity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
getSupportActionBar().setTitle("DetailActivity");
String name = getIntent().getStringExtra("name");
String price = getIntent().getStringExtra("price");
String detail = getIntent().getStringExtra("detail");
((TextView)findViewById(R.id.name)).setText(name);
((TextView)findViewById(R.id.price)).setText(price);
((TextView)findViewById(R.id.detail)).setText(detail);

我要回帖

更多关于 电脑打开安卓软件 的文章

 

随机推荐