Android 检测首次在此会话上打开活动的时间

Android 检测首次在此会话上打开活动的时间,android,android-activity,Android,Android Activity,我需要在用户每次启动应用程序时检测第一次调用活动的情况: 应用程序已启动 第一次调用活动X 做点什么 活动Y和Z被多次调用 活动X被多次调用 无所事事 。。。因此,只有当应用程序关闭(或关闭)后再次启动时,才能调用“do something”(做点什么)。使用此代码 private static boolean isApplicationBroughtToBackground(final Activity activity) { ActivityManager activ

我需要在用户每次启动应用程序时检测第一次调用活动的情况:

  • 应用程序已启动
  • 第一次调用活动X
    • 做点什么
  • 活动Y和Z被多次调用
  • 活动X被多次调用
    • 无所事事
。。。因此,只有当应用程序关闭(或关闭)后再次启动时,才能调用“do something”(做点什么)。

使用此代码

private static boolean isApplicationBroughtToBackground(final Activity activity) {
      ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
      List tasks = null;
      try {
        tasks = activityManager.getRunningTasks(1);
      } catch (SecurityException e) {
        Log.e(TAG, "Missing required permission: \"android.permission.GET_TASKS\".", e);
        return false;
      }
      if (tasks != null && !tasks.isEmpty()) {
        ComponentName topActivity = tasks.get(0).topActivity;
        try {
          PackageInfo pi = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_ACTIVITIES);
          for (ActivityInfo activityInfo : pi.activities) {
            if(topActivity.getClassName().equals(activityInfo.name)) {
              return false;
            }
          }
        } catch( PackageManager.NameNotFoundException e) {
          Log.e(TAG, "Package name not found: " + activity.getPackageName());
          return false; // Never happens.
        }
      }
      return true;
    }

我通常在活动中使用
静态布尔值
变量作为标志。然后,在
onCreate()
内部测试变量;如果它是
真的
,做点什么并翻转标志

public class MainActivity extends Activity {
    private static boolean RUN_ONCE = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...

        runOnce();
    }

    private void runOnce() {
        if (RUN_ONCE) {
            RUN_ONCE = false;

            // do something
        }
    }

    ...
}

当从其他活动调用时,传递一个带意图的布尔额外值。并在开始时检查此意图

     @Override
        protected void onStart() {
            super.onStart();
            boolean firstTime= getIntent().getBooleanExtra("firstTime", true);
    if(firstTime)
{
//do something
}
else
{
//do something
}
使用sqlite

create table first (f INTEGER DEFAULT 0)
public int getFirst(){ codes... }
public void setFirst(){ codes... }


int x = db.getFirst();

    if(x == 0){
        db.setFirst(); //update f column to 1
        DO SOMETHING
    }

“做点什么”到底是什么?你能解释一下你为什么需要这个吗?可能还有另一种简单的方法。当应用程序变成后台应用程序而前台应用程序需要内存时,静态变量有可能被清除。@AndrewT。对我来说,这永远是真的,它不属于else语句。你知道怎么做吗。“runOnce()”将运行一次,但当你终止活动(如“后退”按钮)时,静态bool run_会保存在内存中,因此当你再次启动活动(重新启动)时,runOnce()不会被触发