답변:
static
활동 내에서 변수 를 사용할 수 있습니다 .
class MyActivity extends Activity {
static boolean active = false;
@Override
public void onStart() {
super.onStart();
active = true;
}
@Override
public void onStop() {
super.onStop();
active = false;
}
}
유일한 문제는 서로 연결되는 두 가지 활동에서 사용 onStop
하면 첫 번째는 때로는 onStart
두 번째로 호출 된다는 것 입니다. 따라서 둘 다 간단하게 사실 일 수 있습니다.
수행하려는 작업에 따라 (서비스에서 현재 활동을 업데이트 하시겠습니까?) 액티비티 onStart
메소드 에서 서비스에 정적 리스너를 등록하면 서비스에서 UI를 업데이트하려고 할 때 올바른 리스너를 사용할 수 있습니다.
MyActivity
와 함께 연장 MyChildactivity
하여 자녀가 활동 중인지 확인하려면 어떻게합니까?
이 문제는 상당히 오래되었다는 것을 알고 있지만 다른 사람들에게 유용 할 수 있으므로 여전히 솔루션을 공유 할 가치가 있다고 생각합니다.
이 솔루션은 Android Architecture Components가 출시되기 전에는 사용할 수 없었습니다.
활동이 적어도 부분적으로 보입니다
getLifecycle().getCurrentState().isAtLeast(STARTED)
활동은 전경에 있습니다
getLifecycle().getCurrentState().isAtLeast(RESUMED)
나는 더 분명하게 생각합니다.
public boolean isRunning(Context ctx) {
ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
for (RunningTaskInfo task : tasks) {
if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName()))
return true;
}
return false;
}
보조 변수를 사용하지 않는 옵션은 다음과 같습니다.
activity.getWindow().getDecorView().getRootView().isShown()
활동이 fe 인 경우 : this 또는 getActivity ().
이 표현식이 리턴 한 값은 onStart () / onStop ()에서 변경되며, 이는 전화기에서 활동의 레이아웃 표시를 시작 / 중지하는 이벤트입니다.
Activity#getWindow().getDecorView().isShown()
않습니까?
MyActivity.class 및 getCanonicalName 메서드를 사용하여 답변을 받았습니다.
protected Boolean isActivityRunning(Class activityClass)
{
ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
for (ActivityManager.RunningTaskInfo task : tasks) {
if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
return true;
}
return false;
}
getRunningTasks()
는 사용되지 않습니다 같이 androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/...
정적 변수를 사용하고 OOP를 따르는 것보다 훨씬 좋은 방법
Shared Preferences
activities
하나의 다른 서비스 및 서비스 와 변수를 공유하는 데 사용할 수 있습니다application
public class example extends Activity {
@Override
protected void onStart() {
super.onStart();
// Store our shared preference
SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
Editor ed = sp.edit();
ed.putBoolean("active", true);
ed.commit();
}
@Override
protected void onStop() {
super.onStop();
// Store our shared preference
SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
Editor ed = sp.edit();
ed.putBoolean("active", false);
ed.commit();
}
}
공유 환경 설정을 사용하십시오. 가장 안정적인 상태 정보를 가지고 있으며 응용 프로그램 전환 / 파괴 문제가 적으며, 또 다른 권한을 요청하지 않아도되며 활동이 실제로 가장 최상위 인 시점을 결정할 수있는 제어 기능이 향상됩니다. 참조 자세한 내용은 여기 ABD를 여기
onStop()
특정 서비스가 실행 중인지 확인하기위한 코드입니다. getRunningAppProcesses () 또는 getRunningTasks ()를 사용하여 getRunningServices를 변경하는 한 활동에 대해서도 작동 할 수 있다고 확신합니다. 여기 http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()를 살펴보십시오.
이에 따라 Constants.PACKAGE 및 Constants.BACKGROUND_SERVICE_CLASS를 변경하십시오.
public static boolean isServiceRunning(Context context) {
Log.i(TAG, "Checking if service is running");
ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
boolean isServiceFound = false;
for (int i = 0; i < services.size(); i++) {
if (Constants.PACKAGE.equals(services.get(i).service.getPackageName())){
if (Constants.BACKGROUND_SERVICE_CLASS.equals(services.get(i).service.getClassName())){
isServiceFound = true;
}
}
}
Log.i(TAG, "Service was" + (isServiceFound ? "" : " not") + " running");
return isServiceFound;
}
위의 모든 것보다 훨씬 쉬운 방법이 있으며이 방법 android.permission.GET_TASKS
은 매니페스트에서 사용을 요구하지 않거나 허용되는 답변에서 경쟁 조건 또는 메모리 누수 문제가 지적되었습니다.
기본 활동에서 STATIC 변수를 작성하십시오. 정적은 다른 활동이 다른 활동으로부터 데이터를 수신 할 수있게합니다. onPause()
이 변수를 설정 거짓을 , onResume
그리고 onCreate()
이 변수로 설정 사실을 .
private static boolean mainActivityIsOpen;
이 변수의 getter 및 setter를 지정하십시오.
public static boolean mainActivityIsOpen() {
return mainActivityIsOpen;
}
public static void mainActivityIsOpen(boolean mainActivityIsOpen) {
DayView.mainActivityIsOpen = mainActivityIsOpen;
}
그리고 다른 활동이나 서비스에서
if (MainActivity.mainActivityIsOpen() == false)
{
//do something
}
else if(MainActivity.mainActivityIsOpen() == true)
{//or just else. . . ( or else if, does't matter)
//do something
}
if(!activity.isFinishing() && !activity.isDestroyed())
공식 문서에서 :
finish ()를 호출했거나 다른 사람이 완료를 요청했기 때문에이 활동이 완료 중인지 확인하십시오. 이것은 종종 onPause ()에서 활동이 단순히 일시 중지되었는지 또는 완전히 마무리되는지를 결정하는 데 사용됩니다.
Activity에서 최종 onDestroy () 호출이 수행되었으므로이 인스턴스가 현재 종료 된 경우 true를 리턴합니다.
고마워 kkudi! 활동을 위해 귀하의 답변을 조정할 수있었습니다 ... 여기 내 앱에서 작동 한 것이 있습니다 ..
public boolean isServiceRunning() {
ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE);
isServiceFound = false;
for (int i = 0; i < services.size(); i++) {
if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) {
isServiceFound = true;
}
}
return isServiceFound;
}
이 예제는 topActivity가 사용자의 작업과 일치하는 경우 true 또는 false를 제공합니다. 따라서 확인한 활동이 표시되지 않는 경우 (즉, onPause 인 경우) 일치하지 않습니다. 또한 이렇게하려면 매니페스트에 권한을 추가해야합니다.
<uses-permission android:name="android.permission.GET_TASKS"/>
도움이 되었기를 바랍니다.
나는 수용 된 대답이 이것을 처리하는 끔찍한 방법이라고 생각합니다.
유스 케이스가 무엇인지 모르지만 기본 클래스의 보호 된 메소드를 고려하십시오
@protected
void doSomething() {
}
파생 클래스에서 재정의합니다.
이벤트가 발생하면 기본 클래스에서이 메소드를 호출하십시오. 올바른 'active'클래스가 처리합니다. 그런 다음 클래스 자체가 아닌지 확인할 수 있습니다 Paused()
.
더 나은 방법은 GreenRobot 's , Square ' s 와 같은 이벤트 버스를 사용하는 것입니다.하지만 더 이상 사용되지 않으며 RxJava 사용을 제안합니다
ActivityLifecycleCallbacks는 앱의 모든 활동을 추적하는 좋은 방법입니다.
public class BaseActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
private ActivityState homeState, contentState;
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
if (activity instanceof HomeActivityv2) {
homeState = ActivityState.CREATED;
} else if (activity instanceof ContentDisplayActivity) {
contentState = ActivityState.CREATED;
}
}
@Override
public void onActivityStarted(Activity activity) {
if (activity instanceof HomeActivityv2) {
homeState = ActivityState.STARTED;
} else if (activity instanceof ContentDisplayActivity) {
contentState = ActivityState.STARTED;
}
}
@Override
public void onActivityResumed(Activity activity) {
if (activity instanceof HomeActivityv2) {
homeState = ActivityState.RESUMED;
} else if (activity instanceof ContentDisplayActivity) {
contentState = ActivityState.RESUMED;
}
}
@Override
public void onActivityPaused(Activity activity) {
if (activity instanceof HomeActivityv2) {
homeState = ActivityState.PAUSED;
} else if (activity instanceof ContentDisplayActivity) {
contentState = ActivityState.PAUSED;
}
}
@Override
public void onActivityStopped(Activity activity) {
if (activity instanceof HomeActivityv2) {
homeState = ActivityState.STOPPED;
} else if (activity instanceof ContentDisplayActivity) {
contentState = ActivityState.STOPPED;
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
if (activity instanceof HomeActivityv2) {
homeState = ActivityState.DESTROYED;
} else if (activity instanceof ContentDisplayActivity) {
contentState = ActivityState.DESTROYED;
}
}
public ActivityState getHomeState() {
return homeState;
}
public ActivityState getContentState() {
return contentState;
}
}
ActivityState :
public enum ActivityState {
CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED;
}
Application 클래스를 확장하고 Android Manifest 파일에서 해당 참조를 제공하십시오.
import android.app.Application;
public final class BaseApplication extends Application {
private BaseActivityLifecycleCallbacks baseALC;
@Override
public void onCreate() {
super.onCreate();
baseALC = new BaseActivityLifecycleCallbacks();
this.registerActivityLifecycleCallbacks(baseALC);
}
public BaseActivityLifecycleCallbacks getBaseALC() {
return baseALC;
}
}
다른 활동 상태에 대한 활동 어디에서나 Ckeck :
private void checkAndLaunchHomeScreen() {
Application application = getApplication();
if (application instanceof BaseApplication) {
BaseApplication baseApplication = (BaseApplication) application;
if (baseApplication.getBaseALC().getHomeState() == null || baseApplication.getBaseALC().getHomeState() == ActivityState.DESTROYED) {
//Do anything you want
}
}
}
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
"일을하는" "적절한"방법인지 확실하지 않습니다.
조금 생각 해야하는 것보다 (또는 a) 질문을 해결하는 API 방법이 없다면, 뭔가 잘못하고 있거나 더 많은 문서를 대신 읽을
수 있습니다 (정적 변수는 안드로이드에서 일반적으로 잘못된 방법입니다. 작동 할 수는 있지만 (예 : 프로덕션, 백만 장치에서) 작동하지 않는 경우가 있습니다.
정확히 귀하의 경우에 다른 활동이 살아 있는지 여부를 알아야 하는 이유 를 생각하는 것이 좋습니다 . 또는 클래스를 파생하여 기능 등을 얻을 수 있습니다.
친애하는.
주문 된 방송을 사용하십시오. http://android-developers.blogspot.nl/2011/01/processing-order-broadcasts.html을 참조하십시오
활동에서 onStart에 수신자를 등록하고 onStop에서 등록을 취소하십시오. 예를 들어 서비스가 활동이 더 잘 수행 할 수있는 작업을 처리해야하는 경우 서비스 자체에서 기본 처리기를 사용하여 서비스에서 주문 된 브로드 캐스트를 보냅니다. 이제 활동이 실행 중일 때 응답 할 수 있습니다. 서비스는 결과 데이터를 확인하여 브로드 캐스트가 처리되었는지와 적절한 조치를 취하지 않았는지 확인할 수 있습니다.
허용되는 답변 외에도 활동의 인스턴스가 여러 개인 경우 대신 카운터를 사용할 수 있습니다.
class MyActivity extends Activity {
static int activeInstances = 0;
static boolean isActive() {
return (activeInstance > 0)
}
@Override
public void onStart() {
super.onStart();
activeInstances++;
}
@Override
public void onStop() {
super.onStop();
activeInstances--;
}
}
다음 코드로 쉬운 해결 방법을 찾았습니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
// Activity is being brought to front and not being created again,
// Thus finishing this activity will bring the last viewed activity to foreground
finish();
}
}
액티비티가 백 스택에 있는지 확인하려면 다음 단계를 따르십시오. 1. 응용 프로그램 클래스에서 ArrayList 선언 [응용 프로그램 클래스는 응용 프로그램 태그의 mainfest 파일에 정의 됨]
private ArrayList<Class> runningActivities = new ArrayList<>();
이 목록에 액세스하고 수정하려면 다음 공용 메소드를 추가하십시오.
public void addActivityToRunningActivityies (Class cls) {
if (!runningActivities.contains(cls)) runningActivities.add(cls);
}
public void removeActivityFromRunningActivities (Class cls) {
if (runningActivities.contains(cls)) runningActivities.remove(cls);
}
public boolean isActivityInBackStack (Class cls) {
return runningActivities.contains(cls);
}
모든 활동이이를 확장하는 BaseActivity에서 onCreate 및 onDestroy 메소드를 대체하여 다음과 같이 백 스택에서 활동을 추가 및 제거 할 수 있습니다.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyApplicationClass)getApplication()).addActivityToRunningActivityies
(this.getClass());
}
@Override
protected void onDestroy() {
super.onDestroy();
((MyApplicationClass)getApplication()).removeActivityFromRunningActivities
(this.getClass());
}
마지막으로 활동이 백 스택에 있는지 여부를 확인하려면이 함수 isActivityInBackStack을 호출하지 마십시오.
예 : HomeActivity가 백 스택에 있는지 확인하고 싶습니다.
if (((MyApplicationClass)
getApplication()).isActivityInBackStack(HomeActivity.class)) {
// Activity is in the back stack
} else {
// Activity is not in the back stack
}
public static boolean isActivityActive(Activity activity) {
return !activity.isFinishing() &&
(SDK_INT < JELLY_BEAN_MR1 || !activity.isDestroyed());
}
전경에서 동일한 활동이없는 경우 작동합니다. 알림에서 열면 작동하지 않습니다. 조정하고 다음과 같이 제공했습니다.
public static boolean ativo = false;
public static int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
counter++;
}
@Override
protected void onStart() {
super.onStart();
ativo = true;
}
@Override
protected void onStop() {
super.onStop();
if (counter==1) ativo = false;
}
@Override
protected void onDestroy() {
counter--;
super.onDestroy();
}
그것은 동시에 여러 활동을 열어서 나를 위해 일합니다.