2012-08-24 146 views

回答

0

以前的答案是一個很好的通用解決方案,但確實需要額外的許可,並不一定準確處理您的要求爲知道如果事情是可見的。如果您希望從自己的應用程序中執行此操作,則可以使用Android提供的活動生命週期跟蹤活動的可見性。

請注意,當活動即將變得不再可見時,Activity.onPause發生。 (來自:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

使用onStop檢測不可見性很誘人,但是在下一個活動已經可見之後,通常會觸發它。

相反,onResume可用於跟蹤活動是否可見。

您可以通過Activity的子類以及android.app.application的實現來使用這些行爲,以跟蹤您的任何活動是否可見。

例如:

public class Application extends android.app.Application { 
    private static final String TAG = "example"; 

    private Class<? extends BaseActivity> _visibleActivity = null; 

    public boolean isAnyActivityVisible() { 
    return (_visibleActivity != null); 
    } 

    public synchronized void setVisibleActivity(Class<? extends BaseActivity> activity) { 
    _visibleActivity = activity; 

    Log.w(TAG, 
     String.format("setting visible activity to: %s", 
      isAnyActivityVisible() ? _visibleActivity.toString() : "none") 
    ); 
    } 
} 

要使用此調整應用程序標籤在你的清單,以引用您的應用程序類,如:用來做跟蹤

的應用類

<application 
     android:name="com.example.activityvisibletracker.Application" /> 
... 
</application> 

您的所有活動都會從中獲得的BaseActivity:

public abstract class BaseActivity extends Activity { 

    @Override 
    public void onResume(){ 
    super.onResume(); 
    Application app = (com.example.activityvisibletracker.Application) this.getApplication(); 
    app.setVisibleActivity(this.getClass()); 
    } 

    @Override 
    public void onPause(){ 
    super.onPause(); 

    Application app = (Application) this.getApplication(); 
    app.setVisibleActivity(null); 
    } 
} 

最後,擴展一個例子活動BaseActivity:

public class MainActivity extends BaseActivity { 
    // whatever implementation you like 
} 

每當你想知道,如果事情是可見的(可能是從你的應用中的一些服務或線程),你只需要一個上下文來獲取在應用程序,然後可以調用isAnyActivityVisible(),如:

// cast getApplication() result to your Application type 
((com.example.activityvisibletracker.Application)context.getApplicationContext()).isAnyActivityVisible(); 
0

是的。檢查此代碼:

List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(4096); 
    return runningTasks.get(0).topActivity.getPackageName(); 

返回包名稱。這需要

<uses-permission android:name="android.permission.GET_TASKS" /> 
+0

即使它在背景上也會重現!纔不是 ? – user1411084

+0

它返回當前在屏幕上可見的活動的包名稱。 – FWeigl

0

在鎖屏上稱爲ICS,你的整個生命週期,即使你的應用程序只留坐在那裏,這是行不通的。

相關問題