有什么方法可以识别应用程序是从头开始(即尚未在内存中)还是从后台(已经打开应用程序并点击home
按钮)?
4 回答
如果你真的是指 Application 而不是 Activity,那么你应该创建一个从 android.app.Application 对象派生的类,并在清单中声明这个类,以便能够通过覆盖的方法监视它的生命周期。每次您的应用程序从头开始时都会创建一个此类对象,因此如果您需要在应用程序生命周期中保存一些数据,则此对象或任何类型的单例都是一种很好的方法。
如果您只想知道 APP 何时从后台状态返回(当您返回家中或另一个应用程序并再次返回您的应用程序时)也许这可以帮助您。如果您发现不适用的情况,请告诉我。
public class FatherClass extends Activity {
private static int activities = 0;
public void onCreate(Bundle savedInstanceState, String clase) {
super.onCreate(savedInstanceState);
}
protected void onRestart(){
super.onRestart();
if(activities == 0){
Log.i("APP","BACK FROM BACKGROUND");
}
}
protected void onStop(){
super.onStop();
activities = activities - 1;
}
protected void onStart(){
super.onStart();
activities = activities + 1;
}
}
您的所有活动都必须从这个扩展。
而且很简单,如果您的主要活动执行 onCreate() (您想要的活动中的方法,而不是我的示例中的 onCreate )并且您永远不会从另一个活动中调用它(将其视为启动屏幕),那么您就是从头开始,但是如果您的活动执行 onRestart() 并且计数器“活动”值是 0“零”,那么您正在从后台状态返回,我希望这可以帮助您并且不会为另一个人迟到。
整个代码应该写在一个应用程序特定的超级活动中
boolean isForeground = isInForeground(this);
if ((!hasFocus) && (!isForeground)) {
context.isBackground = true;
Log.v("Alalytics", "Background...");
}
else if (context.isBackground) {
context.isBackground = false;
Log.v("Alalytics", "Forground...");
}
然后...创建方法来检查应用程序是前台还是后台的天气
/** * 检查应用程序是否在前台 * * @param context 上下文 * @return true,如果在前台 ** /
private boolean isInForeground(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;
}
由于声誉低,我无法添加评论,因此我将为 Reddy Raaz 添加新答案:这样您需要额外的权限,这可能会阻止某些用户安装该应用程序。框架只有在从头开始时才真正调用 Application.onCreate 方法。这样您就可以可靠地获取信息,而无需额外的许可。