如何 判断程序是在 前台 还是 后台运行?

fsxin 2014-11-11 09:14:17
如何 判断程序是在 前台 还是 后台运行?

下面是我在网上找到的

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals( getPackageName() ) ) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {


Toast.makeText(RecorderActivity.this, "后台!", Toast.LENGTH_SHORT).show();




}else{



Toast.makeText(RecorderActivity.this, "前台!", Toast.LENGTH_SHORT).show();

}
}

}; 为什么 按了 HOME键后 , 程序已经去了后台,为什么 还是 显示 “前台” ??
...全文
559 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fsxin 2014-11-11
  • 打赏
  • 举报
回复
appProcesses 和 RunningTaskInfo 是什么? 提示没有找到这2个东西
Fiod 2014-11-11
  • 打赏
  • 举报
回复
如果只是需要判断是否在前台,可以直接判断集合首个进程是否为当前进程吧

		if (appProcesses == null || appProcesses.size() == 0)
			return false;
		RunningTaskInfo rti = appProcesses.get(0);
		String pn = rti.baseActivity.getPackageName();
		String packageName = getPackageName();
		return packageName.equals(pn);
Kifile 2014-11-11
  • 打赏
  • 举报
回复
那或者判断有问题呢,在这里你只判断了 RunningAppProcessInfo.IMPORTANCE_BACKGROUND,但是这个状态应该有好几个值,或许你目前是在后台,但不是这一个状态
fsxin 2014-11-11
  • 打赏
  • 举报
回复
我用一个定时器 每隔 几秒 执行一次
Kifile 2014-11-11
  • 打赏
  • 举报
回复
代码看起来没有问题,你是在什么时候触发的呢?
此昵称已隐藏 2014-11-11
  • 打赏
  • 举报
回复
你应该检查Activity栈中顶栈是不是你的Activity,而不是去检查进程。 我随便写了个例子,你自己看看吧

package com.example.checkactivityisforeground;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;

public class MainActivity extends Activity {

	Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			if (msg.what == 0) {
				ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
				RunningTaskInfo info = manager.getRunningTasks(1).get(0);
				String shortClassName = info.topActivity.getShortClassName(); // 类名
				String className = info.topActivity.getClassName(); // 完整类名
				String packageName = info.topActivity.getPackageName(); // 包名
				Toast.makeText(MainActivity.this, "className:" + className, Toast.LENGTH_SHORT).show();
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
//每3秒,显示一次当前顶栈的activity的类名,你需要其它功能的话自己改一下吧
		new Timer().schedule(new TimerTask() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				mHandler.sendEmptyMessage(0);
			}
		}, 3 * 1000, 3 * 1000);

	}
}

此昵称已隐藏 2014-11-11
  • 打赏
  • 举报
回复
  关于android的5个进程等级   1、Foreground Process (前台进程)   a 正处于Activity Resume()状态   b 正处于与bound服务交互的状态   c 正处于服务在前台的状态,(startForeground()被调用)   d Service生命周期函数正在被执行(onCreate(),onStart(),onDestroy())   e BroadcastReceiver正在执行onReceive()方法   杀死Foreground Process需要用户响应,因为这个安全优先级是最高的。   2、Visible Process   Activity不在前台显示,但也没有隐藏,能够看的见,比如弹出一个对话框 (input Method)   一个bound到visible或者foreground的activity的Service ,或者是一个输入法   3、Service Process   正在运行的,不在上述两种状态的Service   4、Background Process(后台进程)   不可见状态的Activity进程,onStop()被调用   5、Empty Process   没有运行任何Components的进程,保留这个进程主要是为了缓存的需要。
此昵称已隐藏 2014-11-11
  • 打赏
  • 举报
回复
在安卓中一个进程可能有5个状态的,比如,你给Activity绑定了一个Service,然后设置Service startForeground,那么你的进程切换到后台也不再是后台进程了,而是前台进程(注意:这里的前台是指它的优先级,并不是可不可见的意思)。
ouye猿 2014-11-11
  • 打赏
  • 举报
回复
可以啊,我刚写了个demo,没有问题啊
public class MainActivity extends Activity {

	private Timer timer;
	private Handler mHandler;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		timer = new Timer();
		timer.schedule(new TimerTask() {
			
			@Override
			public void run() {
				// 需要做的事:发送消息  
	            Message message = new Message();  
	            message.what = 1;  
	            mHandler.sendMessage(message);  
				
				
			}
		}, 2000,1000);
		mHandler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				isBackground(getApplicationContext());
				super.handleMessage(msg);
			}
		};
		
	}

	public  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);
	                          return true;
	                }else{
	                          Log.i("前台", appProcess.processName);
	                          return false;
	                }
	           }
	    }
	    return false;
	}

}

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧