android activiyandroid 判断当前进程activiy是不是前台显示的

1015人阅读
这篇文章主要介绍了Android判断当前应用程序处于前台还是后台的两种方法,有需要的朋友可以参考一下
1、通过RunningTaskInfo类判断(需要额外权限):
&&&& *判断当前应用程序处于前台还是后台
&&& public static boolean isApplicationBroughtToBackground(final Context context) {
&&&&&&& ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
&&&&&&& List&RunningTaskInfo& tasks = am.getRunningTasks(1);
&&&&&&& if (!tasks.isEmpty()) {
&&&&&&&&&&& ComponentName topActivity = tasks.get(0).topA
&&&&&&&&&&& if (!topActivity.getPackageName().equals(context.getPackageName())) {
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
需要在AndroidMenitfest.xml文件中添加以下权限
&uses-permission android:name=&android.permission.GET_TASKS& /&&&
2、通过RunningAppProcessInfo类判断(不需要额外权限):&
public static boolean isBackground(Context context) {
&&& ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
&&& List&RunningAppProcessInfo& appProcesses = activityManager.getRunningAppProcesses();
&&& for (RunningAppProcessInfo appProcess : appProcesses) {
&&&&&&&& if (appProcess.processName.equals(context.getPackageName())) {
&&&&&&&&&&&&&&& if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
&&&&&&&&&&&&&&&&&&&&&&&&& Log.i(&后台&, appProcess.processName);
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }else{
&&&&&&&&&&&&&&&&&&&&&&&&& Log.i(&前台&, appProcess.processName);
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }
&&&&&&&&&& }
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:220214次
积分:2995
积分:2995
排名:第12426名
原创:71篇
转载:131篇
译文:11篇
评论:25条
(1)(3)(2)(1)(5)(7)(5)(8)(12)(1)(1)(4)(5)(7)(3)(4)(9)(15)(3)(1)(3)(16)(2)(4)(8)(2)(4)(7)(4)(5)(8)(5)(7)(40)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'关于Android应用判断是否在前台显示的问题,网上也有了很多方法,这里总结一个网上的方法和分享一个自己的方法。
先解决网上一些方法的问题
在网上还有很多文章是采用下面这种方法处理:
<span style="color: # ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
<span style="color: #
List&RunningTaskInfo& runnings = am.getRunningTasks(Integer.MAX_VALUE);
<span style="color: #
for(RunningTaskInfo info : runnings){
<span style="color: #
if(info.topActivity.equals(activityName)){
<span style="color: #
<span style="color: #
<span style="color: #
这段代码只是描述一种解决办法,但不是完整的,这里仅仅只是贴出判断某个Activity是否在前台显示的部分,只需循环一下某应用的所以Activity即可,问题在于现在am.getRunningTasks(int)现在已经废弃不再使用了,那就需要寻找一种新方法,网友们给出了另一个实现,如下:
1 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List&RunningAppProcessInfo& runnings = am.getRunningAppProcesses();
for(RunningAppProcessInfo running : runnings){
if(running.processName.equals(getPackageName())){
if(running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
|| running.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE){
//前台显示... 8
//后台显示...<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
可能同样需要实现某种特殊功能的朋友看到这段代码直接就拿去用了,然后发现一直都是执行前台显示的代码,网上很多文章没有提到解决方法,其实方法也很简单,只需将这部分代码
在用户线程上运行就可以了,也就是弄个线程,问题解决,因为可能会涉及到UI变化的问题,下面顺便贴上关于异步处理的一种方案的代码:
<span style="color: # Handler handler = new Handler(){
<span style="color: #
<span style="color: #
public void handleMessage(Message msg) {
<span style="color: #
switch(msg.what){
<span style="color: #
case FOREGROUND:
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
核心代码:
new Thread(new Runnable() {
public void run() {
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List&RunningAppProcessInfo& runnings = am.getRunningAppProcesses();
for(RunningAppProcessInfo running : runnings){
if(running.processName.equals(getPackageName())){
if(running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
|| running.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE){
handler.sendEmptyMessage(FOREGROUND);
handler.sendEmptyMessage(...);
}).start();
那这两部分代码去用,问题就可以解决了
顺便说说自己的另一个方法
这个方法其实也很简单,首先弄个Activyty的管理类,然后弄个BaseActivity继承Activity,然后添加一个判断标志,重写六个方法,即可
首先,编写管理类
ActivityCollector:
1 public class ActivityCollector {
public static List&AppCompatActivity& activitys =
new ArrayList&&();
public static void addActivity(AppCompatActivity activity){
activitys.add(activity);
<span style="color: #
public static void removeActivity(AppCompatActivity activity){
<span style="color: #
if(activitys.contains(activity)){
<span style="color: #
activitys.remove(activity);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public static boolean activityInForeground(AppCompatActivity activity)
<span style="color: #
return ((BaseActivity)activity).isF
<span style="color: #
<span style="color: #
<span style="color: #
public static boolean hasActivityInForeground(){
<span style="color: #
for(AppCompatActivity activity : activitys ){
<span style="color: #
if(activityInForeground(activity)){
<span style="color: #
return true;
<span style="color: #
<span style="color: #
<span style="color: #
return false;
<span style="color: #
<span style="color: # }
BaseActivity:
1 class BaseActivity extends AppCompatActivity{
private boolean isForegroud = false;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
<span style="color: #
<span style="color: #
protected void onDestroy() {
<span style="color: #
super.onDestroy();
<span style="color: #
ActivityCollector.removeActivity(this);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
protected void onStop() {
<span style="color: #
super.onStop();
<span style="color: #
isForegroud = false;
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
protected void onPause() {
<span style="color: #
super.onPause();
<span style="color: #
isForegroud = true;
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
protected void onResume() {
<span style="color: #
super.onResume();
<span style="color: #
isForegroud = true;
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
protected void onStart() {
<span style="color: #
super.onStart();
<span style="color: #
isForegroud = true;
<span style="color: #
<span style="color: #
<span style="color: #
public boolean isForegroud(){
<span style="color: #
return isF
<span style="color: #
<span style="color: # }
然后编写的Activity都继承BaseActivity,然后在需要判断应用是否在前台显示的地方简单调用ActivityCollector.hasActivityInForeground()判断即可。
阅读(...) 评论()(android实战)判断当前task中的运行的activity是否为当前应用 - 狗尾草1 - 博客园
判断当前task中的运行的activity是否为当前应用,是:pass,否:打开应用主界面,同时发起震动提醒&&& &&& String packageName = this.getPackageName();&&&&& List&RunningTaskInfo& appTask = activityManager.getRunningTasks(1);
&&&&&&& &&&&&&& if (appTask != null)&&&&&&& &&& &if(appTask.size()&0)&&&&&&& &&& &&& &if(appTask.get(0).topActivity.toString().contains(packageName))&&&&&&& &&& &&& &&& &isAppInFront=&&&&&&& &&&博客分类:
如果一个APP在被转到了后台,就很有可能被系统回收,
当APP在后台被系统回收,再次打开APP的时候,会发生什么事情呢?(以下是个人测试得到)
1,一般所有能回收的Activity都会被回收, Application 也会销毁
2,会在一个新的进程中新建一个应用, 意味所有旧的变量,常量都不存在了 ,是所有哦!!!
3,重新加载APP最后显示的Activity
4,这个时候点击返回键,会重新加载倒数第二个Activity, 以此类推...
我遇到的问题是保存在 全局变量 和 静态变量 都没有数据了
我要实现的效果是如果APP被后台回收,就重新打开应用, 实现如下:
1,定义一个基类BaseActivity
2,除了程序入口的Activity 其他activity都继承BaseActivity
3,在BaseActivity的onCreate方法中判断必要的变量是否销毁,如果销毁了就调用
android.os.Process.killProcess(android.os.Process.myPid());
来结束整个应用
这样所有的activity都会被关闭,而程序入口的activity会重新加载,达到了重新加载的效果
为什么 killProcess 不会结束程序入库的activity呢?
系统其实只是记录了APP中activity打开的顺序,当我们再次打开被系统回收的APP的时候APP中其实只有一个activity,当我面killProcess的时候,系统又会重新建一个线程去打开倒数第二个activity,依次类推
当打开程序入口的activity时,由于我们去没有销毁它,所以activity被重新加载,相当于重新打开了应用
浏览: 611308 次
来自: 广州
我用 Thread.currentThread().getId ...
wl8269961 写道设置方法:window--&pr ...
sendMessageDelayed 不能实现循环, 看看这个 ...
回答得无比的赞
很好用,感谢
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'&nbsp&#8250&nbsp&nbsp&#8250&nbsp
Activity的生命周期之Pause(暂停)和Resume(重新返回)
在一个app的运行期间,前台的activity有时可能会被其他的视图组件打断,然后进入pause状态。 比如打开一个半透膜的activity (比方一个dialog风格的activity),前一个activity就会进入pause。其实这个时候前一个activity是部分可见的,只是被后来的视图组建挡住了而 失去焦点,这种情况下,失去焦点的activity就处于pause状态。但是,当一个activity被打断,并且完全不可见时(即使没被挡住也看不到),这时activity就是处于stops状态(下一课程会讲到)注:当activity收到onPause()命令的时候, 暗示着这个activity会暂停一会儿,用户可能会再次回到这个activity。但是实际情况中, 用户离开一个应用的第一个先兆也是暂停某个activity,很可能是真的要离开了。图 1.当一个半透明的activity挡住了你的activity,系统将会调用onPause()方法,同时这个activity在pause 阶段(1)等待。如果用户回到activity的时候还是pause状态,系统将会调用onResume()(2).暂停(pause)你的Activity当系统调用activity的onPause()时, 虽然从技术角度来讲你的activity是可见的,但是更通常这也预示着用户会离开这个activity,然后你的activity会进入stop状态。 基于这种实际情况,通常你应该在onPause()方法里面做如下事情(应该这样做,但不强制,你可以什么也不做-译者注):停止一切动画效果,或者其他消耗cpu的行为。在离开之前提交未被保存改动,你应该只保存那些用户认为应该保存的数据,比如在邮箱应用中,用户正在向文本输入框中写入文字,那么这种改动 被保存下来才显得合理。释放系统资源,比如广播接受者,传感处理器(gps等),或者其他影响电池消耗的东西,因为在pause状态下用户并不需要他们。比如你的应用在使用Camera,那么onPause()方法是你释放它的好地方:@Override
public void onPause() {
super.onPause();
// Always call the superclass method first
// Release the Camera because we don't need it when paused
// and other activities might need to use it.
if (mCamera != null) {
mCamera.release()
}一般来说,你不要在onPause()中保存用户的改动(比如用户正在填写的私人信息的表格),只有当你确信用户希望自己修改的东西被保存的时候 ,比如刚刚提到的用户在写一封邮件的草稿。另外,在onPause中要避免发生cpu敏感的行为,比如写入数据库,这会影响切换到下一个activity的显示效果。总之,在onPause中的操作都应该是非常简单的,低性能消耗的,确保在onStop()被调用时,用户向其他界面的切换是迅速流畅的。注:当activity处于pause状态的时候,activity的实例继续常驻在内存中,当onresume发生的时候被重新调用。 你不需要重新初始化在onResume之前的任何阶段创建的控件Resume 你的 Activity当用户从pause状态回到activity,系统将会调用onResume()方法。值得注意的是每次activity回到前台显示的时候onResume方法都会被调用,即使在第一次启动activity的时候也是如此。所以,你应该实现onResume() 来初始化你在onPause()中释放了资源的控件,同时主动触发activity在进入resume状态的时候会发生的其他所有初始化(比如在activity获得用户焦点的时候动画效果和控件的初始化)。下面的onResume()方法的具体实现是和前面提到的camera例子中的onPause()方法相对应的。在onPause()中我们释放了camera资源,当activity 重新回来的时候我们应该在onResume()中重新初始化它。@Override
public void onResume() {
super.onResume();
// Always call the superclass method first
// Get the Camera instance as the activity achieves full user focus
if (mCamera == null) {
initializeCamera(); // Local method to handle camera init
上一篇: 读完 上一篇文章 之后在app中显示出了文本输入框和按钮,这篇文章我们会在 MainActivity 中添加代码,当点击send按钮之后,调用另外一个activity。 响应send按钮的点击事件 我们直接通过 button的 android:onClick 属性来关联点击事件: Button android:layo
下一篇: 停止(stopping)和重启(restarting)是activity生命周期中很重要的过程,只有恰当的处理停止和重启过程才能让用户认为你的app始终是连贯的运行着的,在这两个过程之间 用户并不会觉得自己的操作被中断过。以下是stopping和restarting这两个过程发生的典型}

我要回帖

更多关于 android 判断当前界面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信