Android 确定应用程序是否位于前台-是否不赞成?
检测应用程序是否在前台有很多原因。 例如,作为GCM/C2DM推送通知的触发器,当应用程序处于前台和后台时,很多应用程序都有很好的理由实现不同的行为。 另一个原因可能是——关闭消耗宝贵资源的服务,例如在后台任务中查询服务器 需要明确的是:后台应用的定义(在我看来)是:Android 确定应用程序是否位于前台-是否不赞成?,android,activity-lifecycle,application-lifecycle,Android,Activity Lifecycle,Application Lifecycle,检测应用程序是否在前台有很多原因。 例如,作为GCM/C2DM推送通知的触发器,当应用程序处于前台和后台时,很多应用程序都有很好的理由实现不同的行为。 另一个原因可能是——关闭消耗宝贵资源的服务,例如在后台任务中查询服务器 需要明确的是:后台应用的定义(在我看来)是: 没有任何it活动通过onStart()方法调用的应用程序,尚未调用onStop()方法。 这是因为用户在it生命周期中只能在那个时候看到活动 另一方面— 谷歌似乎不希望应用程序对home按钮做出反应(它不是API的一部分) 对“
没有任何it活动通过
onStart()
方法调用的应用程序,尚未调用onStop()
方法。
这是因为用户在it生命周期中只能在那个时候看到活动
另一方面—
- 谷歌似乎不希望应用程序对home按钮做出反应(它不是API的一部分)
- 对“root/main”活动上的
做出反应,作为离开onBackPressed()
活动的指示器肯定不是个好主意(因为很多用户使用home按钮,而不是back按钮)
- API中没有允许确定应用程序是否为前台的方法(根据我的定义…)
- 没有这样的API方法是有充分理由的吗
- 考虑应用程序是否处于前台是一种不好的方法吗
- 有没有其他方法可以知道应用程序是否是前台应用程序
AlarmManager
alarm、传入系统广播等),此时您希望根据您是否在前台采取不同的行动onUserLeaveHint()
是最可靠的简单选项。我不能保证它将涵盖所有情况,但它应该处理家庭场景,例如。还欢迎您在静态数据成员中维护已启动活动的引用计数,并尝试使用它
在后一种情况下,A可能很有用。我也有同样的问题。我想在我的活动未处于前台模式时显示推送通知。请通过下面的代码,你会得到你的答案
Context ctx = context.getApplicationContext();
ActivityManager am = (ActivityManager) context
.getSystemService(ACTIVITY_SERVICE);
// get the info from the currently running task
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
PackageManager pm = this.getPackageManager();
try {
/**
* take fore ground activity name
*/
ComponentName componentInfo = taskInfo.get(0).topActivity;
if (printLog == true) {
Log.d("Home", "CURRENT Activity ::"
+ taskInfo.get(0).topActivity.getClassName());
Log.d("Home", "Number Of Activities : "
+ taskInfo.get(0).numRunning);
Log.d("Home",
"Componenet Info : " + componentInfo.getPackageName());
Log.d("Home",
"Componenet Info : " + componentInfo.getClassName());
}
/**
* All activities name of a package to compare with fore ground
* activity. if match found, no notification displayed.
*/
PackageInfo info = pm.getPackageInfo(
"<PackageName>",
PackageManager.GET_ACTIVITIES);
ActivityInfo[] list = info.activities;
for (int i = 0; i < list.length; i++) {
Log.d("TAG","Activity : "+list[i].name);
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
Context ctx=Context.getApplicationContext();
ActivityManager am=(ActivityManager)上下文
.getSystemService(活动和服务);
//从当前正在运行的任务中获取信息
List taskInfo=am.getRunningTasks(1);
PackageManager pm=this.getPackageManager();
试一试{
/**
*以地面活动名称为准
*/
ComponentName componentInfo=taskInfo.get(0).topActivity;
if(printLog==true){
Log.d(“主页”,“当前活动:”
+taskInfo.get(0.topActivity.getClassName());
日志d(“主页”,“活动数量:”
+taskInfo.get(0.numRunning);
Log.d(“主页”,
组件网信息:“+componentInfo.getPackageName());
Log.d(“主页”,
组件网信息:“+componentInfo.getClassName());
}
/**
*要与fore ground进行比较的包的所有活动名称
*活动。如果找到匹配项,则不显示通知。
*/
PackageInfo=pm.getPackageInfo(
"",
PackageManager.GET_活动);
ActivityInfo[]列表=info.activities;
for(int i=0;i
要使用它,您必须在清单
文件中获得权限
使用权限android:name=“android.permission.GET\u任务”
如果我不能回答您的问题,请原谅。如果您需要知道应用程序是在后台运行的服务的后台还是前台(否则没有意义),那么您可以使用绑定,即在恢复时对所有活动绑定,在暂停时对所有活动解除绑定。然后,在您的服务中,您不仅可以管理应用程序对用户的可见性,还可以随时管理哪些活动处于打开状态。在使用安卓API并依赖安卓操作系统代码本身的正确性时,它比静态变量(必要时可以清除)更防泄漏、更稳定。有了新的安卓体系结构组件,就可以很容易地知道你的应用程序是在前台还是后台 与activity scope lifecycle owner一样,有一个通用流程生命周期所有者,您可以订阅并获取生命周期更新 例如: 添加此代码以注册为生命周期观察者
ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleListener)
和此代码,以便接收相关回调
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onApplicationOnStartEvent() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onApplicationOnStopEvent() {
}
<
ProcessLifecycleOwner.get().getLifecycle().removeObserver(lifecycleListener);