use*_*305 118
我不明白你想要什么,但你可以通过ActivityManager.getRunningAppProcesses()
电话检测当前的前台/后台应用程序.
就像是,
class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {
@Override
protected Boolean doInBackground(Context... params) {
final Context context = params[0].getApplicationContext();
return isAppOnForeground(context);
}
private boolean isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
}
// Use like this:
boolean foregroud = new ForegroundCheckTask().execute(context).get();
Run Code Online (Sandbox Code Playgroud)
如果我误解了,也请告诉我.
更新:请查看此SO问题从后台任务或服务确定当前前台应用程序更多信息..
谢谢..
net*_*ein 41
@ user370305的答案很容易出错并且不被Android操作系统开发人员所阻止(请查看https://groups.google.com/forum/#!msg/android-developers/zH-2bovZSLg/L2YM8Z1N-HwJ)
有一个更简单的方法:
在所有活动扩展的BaseActivity上:
protected static boolean isVisible = false;
@Override
public void onResume() {
super.onResume();
setVisible(true);
}
@Override
public void onPause() {
super.onPause();
setVisible(false);
}
Run Code Online (Sandbox Code Playgroud)
每当您需要检查您的任何应用程序活动是否在前台时,只需检查 isVisible();
要了解此方法,请检查并行活动生命周期的答案:活动并行生命周期
ces*_*rds 38
到目前为止我发现的最新且未被弃用的方式如下:
@Override
public boolean foregrounded() {
ActivityManager.RunningAppProcessInfo appProcessInfo = new ActivityManager.RunningAppProcessInfo();
ActivityManager.getMyMemoryState(appProcessInfo);
return (appProcessInfo.importance == IMPORTANCE_FOREGROUND || appProcessInfo.importance == IMPORTANCE_VISIBLE)
}
Run Code Online (Sandbox Code Playgroud)
它仅适用于SDK 16+.
编辑:
我从解决方案中删除了以下代码:
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
// App is foreground, but screen is locked, so show notification
return km.inKeyguardRestrictedInputMode();
Run Code Online (Sandbox Code Playgroud)
因为如果屏幕锁定,则不会收到通知.我看一下框架,目的并不完全清楚.我会删除它.检查进程信息状态就足够了:-)
mht*_*ani 18
借助全新的Android生命周期扩展架构,我们可以轻松实现这一目标.
只需确保在build.gradle文件中提取此依赖项:
dependencies {
implementation "android.arch.lifecycle:extensions:1.1.0"
}
Run Code Online (Sandbox Code Playgroud)
然后在您的Application类中,使用:
class ArchLifecycleApp : Application(), LifecycleObserver {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackgrounded() {
Log.d("MyApp", "App in background")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForegrounded() {
Log.d("MyApp", "App in foreground")
}
}
Run Code Online (Sandbox Code Playgroud)
最后,使用以下命令更新AndroidManifest.xml文件:
<application
android:name=".ArchLifecycleApp"
//Your extra code
....>
</application>
Run Code Online (Sandbox Code Playgroud)
现在,每次Application转到Foreground或Background时,我们都会收到与声明的两个方法相关的Logs.
Jit*_*iya 10
我尝试过运行过程中的包过滤器.但这很奇怪.而不是那样,我尝试了新的解决方案,这完美.我已多次检查并通过此模块获得完美结果.
private int numRunningActivities = 0;
public void onCreate() {
super.onCreate();
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityStarted(Activity activity) {
numRunningActivities++;
if (numRunningActivities == 1) {
LogUtils.d("APPLICATION", "APP IN FOREGROUND");
}
}
@Override
public void onActivityStopped(Activity activity) {
numRunningActivities--;
if (numRunningActivities == 0) {
Log.e("", "App is in BACKGROUND")
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
检查应用程序是在后台还是前台.如果应用程序在后台,此方法将返回true.
首先将GET_TASKS权限添加到AndroidManifest.xml
private boolean isAppIsInBackground(Context context) {
boolean isInBackground = true;
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
for (String activeProcess : processInfo.pkgList) {
if (activeProcess.equals(context.getPackageName())) {
isInBackground = false;
}
}
}
}
} else {
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
if (componentInfo.getPackageName().equals(context.getPackageName())) {
isInBackground = false;
}
}
return isInBackground;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以使用ProcessLifecycleOwner使用Android体系结构组件库为onStart和onStop事件设置整个应用程序过程的侦听器。为此,使您的应用程序类实现LifecycleObserver接口,并为前景和后台方法添加onStop和onStart的一些注释。
class ArchLifecycleApp : Application(), LifecycleObserver {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackgrounded() {
Log.d("Awww", "App in background")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForegrounded() {
Log.d("Yeeey", "App in foreground")
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
115550 次 |
最近记录: |