在Android开发中,我们经常想知道是否自己的服务处于后台运行中,因为在后台运行的服务器优先级会降低,也就极有可能会被系统给回收掉,有什么好办法呢?Google推荐我们将服务运行到前台,如何知道服务是否处于后台运行呢?可以通过获取堆栈信息中栈顶的Activity是否为本应用即可。

1。下面是关健部分代码:

(记得加上权限:<uses-permission android:name="android.permission.GET_TASKS"/>)

mPackageName为本应用包名,mActivityManager为Activity管理对象

mActivityManager = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));

mPackageName = getPackageName();

	public boolean isAppOnForeground() {
List<RunningTaskInfo> tasksInfo = mActivityManager.getRunningTasks(1);
if (tasksInfo.size() > 0) {
L.i("top Activity = "
+ tasksInfo.get(0).topActivity.getPackageName());
// 应用程序位于堆栈的顶层
if (mPackageName.equals(tasksInfo.get(0).topActivity
.getPackageName())) {
return true;
}
}
return false;
}

2。下面又会有一个新问题,我们什么时候调用这个函数呢?有两个办法,一个是主动,一个是被动,

①.主动办法:在服务中开启一个线程,每隔一段时间调用一下这个函数即可。

②.被动办法:自定义一个BaseActivity继承Activity,然后在onPause函数中回调通知一下服务中的此函数,然后应用中的每个Activity都继承BaseActivity,即可知道栈顶中是否还有本应用的Activity。

3.当我们知道栈顶中的Activity不是本应用的了,我们的服务也就相应的降低了优先级,也就说系统需要内存的时候,首先就会回收此服务消耗的内存。此时,我们只需将服务设置为前台运行即可:

①.设置为前台:第一个参数是通知ID,第二个参数是Notification对象

startForeground(SERVICE_NOTIFICATION, n);

②.停止前台服务可调用:true代表清除通知栏

stopForeground(true);

public void updateServiceNotification(String message) {
if (!PreferenceUtils.getPrefBoolean(this,
PreferenceConstants.FOREGROUND, true))
return;
String title = PreferenceUtils.getPrefString(this,
PreferenceConstants.ACCOUNT, "");
Notification n = new Notification(R.drawable.login_default_avatar,
title, System.currentTimeMillis());
n.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
n.contentIntent = PendingIntent.getActivity(this, 0,
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); n.setLatestEventInfo(this, title, message, n.contentIntent);
startForeground(SERVICE_NOTIFICATION, n);
} // 判断程序是否在后台运行的任务,其实个人觉得这个办法并不太好,
Runnable monitorStatus = new Runnable() {
public void run() {
try {
L.i("monitorStatus is running... " + mPackageName);
mMainHandler.removeCallbacks(monitorStatus);
// 如果在后台运行并且连接上了
if (!isAppOnForeground()) {
L.i("app run in background...");
// if (isAuthenticated())//不判断是否连接上了。
updateServiceNotification(getString(R.string.run_bg_ticker));
return;// 服务已在前台运行,可以停止重复执行此任务
} else {
stopForeground(true);
}
mMainHandler.postDelayed(monitorStatus, 1000L);
} catch (Exception e) {
e.printStackTrace();
L.i("monitorStatus:"+e.getMessage());
}
}
};

OK,以上仅是本人的一点心得体会,可能有不正确的地方,请大家甄别使用,谢谢!

Android之后台服务判断本应用Activity是否处于栈顶的更多相关文章

  1. Android Services (后台服务)

    一.简介 服务是可以在后台执行长时间运行的应用程序组件,它不提供用户界面. 另一个应用程序组件可以启动一个服务,并且即使用户切换到另一个应用程序,它仍然在后台运行. 另外,组件可以绑定到一个服务来与它 ...

  2. 判断当前的Activity的是否处于栈顶

    lockAppName 是需要判断Activity的全称(包括包名). private boolean getTopApp(Context mContext) { String lockAppName ...

  3. Android 点击桌面快捷方式和Notifycation跳转到Task栈顶Activity

    我们一般下载的应用在第一次启动应用的时候都会给我创建一个桌面快捷方式,然后我在网上找了些资料整理下了,写了一个快捷方式的工具类,这样我们以后要创建快捷方式的时候直接拷贝这个类,里面提供了一些静态方法, ...

  4. Android群英传笔记——第八章:Activity与Activity调用栈分析

    Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...

  5. 详解Android中的四大组件之一:Activity详解

    activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...

  6. 入职小白随笔之Android四大组件——活动详解(activity)

    推荐Android入门书籍:第一行代码(郭霖) google官方文档地址:https://developer.android.google.cn/guide/components/activities ...

  7. Android基础总结(2)——活动Activity

    1.什么是活动(Activity) 活动(Activity)是一种可以包含用户界面的组件,主要用于和用户进行交互.一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见. 2.怎么使用 ...

  8. Android Activity的任务栈和四大启动模式

    在安卓系统中默认每次启动一个Activity时,系统会创建一个实例,并按照先进后出的原则放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会 ...

  9. 【起航计划 007】2015 起航计划 Android APIDemo的魔鬼步伐 06 App->Activity->Forwarding Activity启动另外一个Activity finish()方法

    Android应用可以包含多个Activity,某个Activity可以启动另外的Activity. 这些Activity采用栈结构来管理,新打开的Activity叠放在当前的Activity之上,当 ...

随机推荐

  1. Android 涂鸦最佳实践

    Android中实现手势画图一般都两种方式,一是直接在View上绘制,而是使用SurfaceView. 两者还是有一些差别的.简介下. View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事 ...

  2. [概率dp] ZOJ 3822 Domination

    题意: 给N×M的棋盘.每天随机找一个没放过棋子的格子放一个棋子 问使得每一个每列都有棋子的天数期望 思路: dp[i][j][k] 代表放了i个棋子占了j行k列 到达目标状态的期望 然后从 dp[n ...

  3. android 应用静默自启动的解决方法

    一个apk完全的自动静默启动目前不能实现,所以就用到了Activity的一个方法activity.moveTaskToBack(boolean),这个方法就是可以退出应用到后台而不是finish()退 ...

  4. .net嵌入c#代码(投票练习)

    .net嵌入c#代码(投票练习) <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" ...

  5. Rfc2898DeriveBytes解密如何通过java实现

    原文 Rfc2898DeriveBytes解密如何通过java实现 这个找了半天,还是不太懂,密码一点不懂,直接上来问了 Rfc2898DeriveBytes对应的是PBKDF2WithHmacSHA ...

  6. Js脚本实现选项卡的实例

    效果演示: 具体代码: <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http:/ ...

  7. JAVA多态学习3

    这一节我们来学习抽象类 抽象类–深入讨论 抽象类是java中一个比較重要的类. 1.用abstract关键字来修饰一个类时.这个类就是抽象类. 2.用abstract关键字来修饰一个方法时,这种方法就 ...

  8. 添加Main-Class到manifest中

    Maven默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(打开jar文件中的META-INF/MANIFEST.MF文件,将无法看到Main-Clas ...

  9. 【笔记】《通俗详细地讲解什么是P和NP问题》的概念记录

    1问题规模: 要计算或解决一个问题,该问题通常有一个大小规模,用n表示. 2算法的时间复杂度 计算次数与n的关系函数.(因为计算次数隐含时间). 3多项式时间复杂度 所有形如a*n^k+b*n^(k- ...

  10. JAVA中extends 与implements有啥区别?

    JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extend ...