web-dev-qa-db-ja.com

私の活動が画面で実行中の現在の活動であるかどうかを確認する方法

通知にToastを使用しましたが、現在の画面にアクティビティがなく、他のアクティビティが開始されているように見えます。

この状況を確認したいのですが、アクティビティが現在のアクティビティでない場合は、トースト通知を送信しません。しかし、どうすればよいですか?

23
virsir

アクティビティが前面に来ると、そのonResume()メソッドが呼び出されます。別のアクティビティがアクティビティの前に来ると、そのonPause()メソッドが呼び出されます。したがって、必要なのは、アクティビティがフォアグラウンドにあるかどうかを示すブール値を実装することだけです。

private boolean isInFront;

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

@Override
public void onPause() {
    super.onPause();
    isInFront = false;
}
83
Andy Zhang
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(); 
}

これにより、ポイントされたアクティビティが現在表示されているアクティビティであるかどうかがわかります。

7
Samet

私は自分で状態を処理したくないので、これを行うクラスを実装しました。

_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;
    }
}
_

次に、アクティビティでこれを拡張し、getActivityState()を呼び出して状態を取得できます。

4
Minas Mina

これが私の究極のisActivityVisible関数です。

protected boolean isActivityVisible() {
    if (this.mActivity != null) {
        Class klass = this.mActivity.getClass();
        while (klass != null) {
            try {
                Field field = klass.getDeclaredField("mResumed");
                field.setAccessible(true);
                Object obj = field.get(this.mActivity);
                return (Boolean)obj;
            } catch (NoSuchFieldException exception1) {
//                Log.e(TAG, exception1.toString());
            } catch (IllegalAccessException exception2) {
//                Log.e(TAG, exception2.toString());
            }
            klass = klass.getSuperclass();
        }
    }
    return false;
}
2
Melug
if (BaseActivity.this instanceof Faq)
            {
                Toast.makeText(BaseActivity.this, "You are in the Same Page", Toast.LENGTH_SHORT).show();
            }else {
                Intent intent = new Intent(BaseActivity.this, Faq.class);
                startActivity(intent);
                drawer.closeDrawer(GravityCompat.START);
            }

//// here amすべてのアクティビティはBaseActivityというアクティビティで拡張されています

1
Nishanth S Babu

Activity#isTaskRoot() メソッドがあります

1
Andrey