那或者判断有问题呢,在这里你只判断了 RunningAppProcessInfo.IMPORTANCE_BACKGROUND,但是这个状态应该有好几个值,或许你目前是在后台,但不是这一个状态

解决方案 »

  1.   

    如果只是需要判断是否在前台,可以直接判断集合首个进程是否为当前进程吧 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);
      

  2.   

    appProcesses 和   RunningTaskInfo  是什么?  提示没有找到这2个东西
      

  3.   

    可以啊,我刚写了个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;
    }}
      

  4.   

    在安卓中一个进程可能有5个状态的,比如,你给Activity绑定了一个Service,然后设置Service  startForeground,那么你的进程切换到后台也不再是后台进程了,而是前台进程(注意:这里的前台是指它的优先级,并不是可不可见的意思)。
      

  5.   

      关于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的进程,保留这个进程主要是为了缓存的需要。
      

  6.   

    你应该检查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); }
    }