如何检查我的活动是否是屏幕中正在运行的当前活动

vir*_*sir 23 lifecycle android screen android-activity

我使用Toast进行通知,但似乎即使它的活动不在当前屏幕中也会出现,并且其他一些活动已经启动.

我想检查这种情况,当活动不是当前活动时,我不会发送Toast通知.但怎么办?

And*_*ang 83

当您的Activity到达前台时,onResume()将调用其方法.当另一个Activity出现在Activity之前时,onPause()将调用其方法.所以你需要做的就是实现一个布尔值,指示你的Activity是否在前台:

private boolean isInFront;

@Override
public void onResume() {
    super.onResume();
    isInFront = true;
}

@Override
public void onPause() {
    super.onPause();
    isInFront = false;
}
Run Code Online (Sandbox Code Playgroud)

  • 我个人没有遇到或使用过这种方法,但在我看来,上述解决方案也很方便. (7认同)
  • 你需要调用super.onResume(); 避免android.app.SuperNotCalledException (4认同)
  • 有任何方便的方法吗?喜欢Activety :: isActive() (2认同)
  • 此解决方案仅适用于Android API 4.1+.在4.1以下,您还需要覆盖活动的onWindowFocusChanged方法,以查看它是否确实具有焦点.要测试这种情况(在API 4.1下面),您可以在活动运行时按电源按钮(将调用您的活动暂停)然后再次按电源按钮(将调用您的活动的响应),但您的应用将不会来前景,直到你打开屏幕锁定. (2认同)

Sam*_*met 7

ArrayList<String> runningactivities = new ArrayList<String>();

ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE); 

List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 

for (int i1 = 0; i1 < services.size(); i1++) { 
    runningactivities.add(0,services.get(i1).topActivity.toString());  
} 

if(runningactivities.contains("ComponentInfo{com.app/com.app.main.MyActivity}")==true){
    Toast.makeText(getBaseContext(),"Activity is in foreground, active",1000).show(); 
}
Run Code Online (Sandbox Code Playgroud)

这样,您将知道指向的活动是否是当前可见活动.


Min*_*ina 5

我不喜欢自己处理状态,所以我实现了一个为我做这件事的类。

package mypackage;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

// Mine extends AppCompatActivity - your's might need to extend Activity, depending on whether
// you use the support library or not.
public class StateTrackingActivity extends AppCompatActivity {

    public enum ActivityState {

        CREATED, RESUMED, STARTED, PAUSED, STOPPED, DESTROYED
    }

    private ActivityState _activityState;

    protected ActivityState getActivityState() { return _activityState; }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        _activityState = ActivityState.CREATED;
    }

    @Override
    protected void onResume() {

        super.onResume();
        _activityState = ActivityState.RESUMED;
    }

    @Override
    protected void onStart() {

        super.onStart();
        _activityState = ActivityState.STARTED;
    }

    @Override
    protected void onPause() {

        super.onPause();
        _activityState = ActivityState.PAUSED;
    }

    @Override
    protected void onStop() {

        super.onStop();
        _activityState = ActivityState.STOPPED;
    }

    @Override
    protected void onDestroy() {

        super.onDestroy();
        _activityState = ActivityState.DESTROYED;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你的 Activity 可以扩展这个,你可以通过调用getActivityState().