在屏幕上检测应用程序

时间:2012-08-24 17:40:12

标签: android

有没有办法检测到屏幕上正在运行的应用?这意味着用户正在使用的应用程序并且对用户可见。提前谢谢!

2 个答案:

答案 0 :(得分:0)

是。检查此代码:

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

返回包名称。这需要

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

答案 1 :(得分:0)

之前的答案是一个很好的通用解决方案,但确实需要额外的许可,并且可能无法完全处理您的需求以了解某些内容是否可见。如果您希望从自己的应用内部执行此操作,则可以使用Android提供的活动生命周期来跟踪活动的可见性。

请注意,当活动即将变得不再对用户可见时,会发生Activity.onPause。 (来自:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

使用onStop来检测不可见性很诱人,但这通常在下一个活动已经可见之后被触发。

相反,onResume可用于跟踪活动是否可见。

您可以通过Activity的子类以及android.app.application的实现来使用这些行为,以跟踪您的任何活动是否可见。

例如:

用于跟踪的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类,如下所示:

<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的示例Activity:

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

每当你想知道某些东西是否可见时(可能来自你应用中的某个服务或线程)你只需要一个Context来获取Application,然后可以调用isAnyActivityVisible(),如下所示:

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