有没有办法检测到屏幕上正在运行的应用?这意味着用户正在使用的应用程序并且对用户可见。提前谢谢!
答案 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();