对于一些应用要求应用没有完全退出的情况下在后台运行时要弹出通知以方便用户进入软件。例如QQ就在退到后台的时候弹出正在运行的提示通知。
初步总结实现这种效果可以有一下三种方式:
1、可以监听onstop()方法。因为如果应用退到后台必然会执行onstop()方法,而在应用内间的跳转如果没有执行finish()的话页面通常只会执行onpause()方法,除非内存严重不足导致系统回收掉了后台页面。但由于应用内一些操作比如调用系统相机、图库等操作由于切换了程序(图库是系统程序)所以也会执行onstop()导致要加以过滤还有一些特殊操作难以把控所以实用性不强。但一般的需求是可以满足的。
2、可以监听home键和主页面(即你的activity任务栈的栈底activity也即程序的入口页面)监听back键。在监听事件中做相关的操作比如显示通知等操作。但是由于home键默认无法监听,只有页面时键盘类型的页面才能监听到home键所以必须更改页面的类型。如下:
01
02
03
04
|
public
void
onAttachedToWindow(){
this
.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super
.onAttachedToWindow();
}
|
这样就会在一些页面出现问题因为这是页面的类型被更改了还有就是即使这样也不能保证所以手机和android版本都能监听到所以也有风险。常用机型可以android2.2可以监听。
3、通过启动后台服务实时监听系统进程栈的动态获取当前前台进程是否是自己应用的进程。该方式可靠但要启动服务,对于一个本没有必要启动后台服务的程序,这本来就是很纠结的事情。为了一个后台通知去开启一个服务也会让用户浮想联翩。下面是精华代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
activityManager = (ActivityManager)
this
.getSystemService(Context.ACTIVITY_SERVICE);
packageName =
this
.getPackageName();
System.out.println(
"启动服务"
);
new
Thread() {
public
void
run() {
try
{
while
(!isStop) {
Thread.sleep(
1000
);
if
(isAppOnForeground()) {
Log.v(TAG,
"前台运行"
);
}
else
{
Log.v(TAG,
"后台运行"
);
showNotification();
}
}
}
catch
(Exception e) {
e.printStackTrace();
}
}
}.start();
|
判断是否在前台:
01
02
03
04
05
06
07
08
|
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if
(appProcesses ==
null
)
return
false
;
for
(RunningAppProcessInfo appProcess : appProcesses) {
// The name of the process that this object is associated with.
if
(appProcess.processName.equals(packageName)
&& appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return
true
;
|