【问题标题】:Android Activity life cycle issuesAndroid Activity 生命周期问题
【发布时间】:2012-12-13 17:58:30
【问题描述】:

我真正想要的是什么?

在我的应用程序中,我有 4/5 个活动和一个与服务器对话的后台线程。我想有一些方法来获得我的应用程序的最高活动。但令人惊讶的是,他们不是我能得到的吗?

我做了什么?

搜索了一段时间后,我实现了一个类型为Activity 的变量mCurrentOnTopActivity,并在我设置该变量的每个活动的onResume()onPause() 上。 (这实际上是一种糟糕的方式)。

我到达了哪里?

现在他们的情况是,在收到来自服务器的一些消息后,我想在 UI 线程上做一些事情,即显示一些对话框或刷新 ListView,现在他们无法检查 mCurrentOnTopActivity 是否引用活动它实际上是否正在运行(无论出于何种原因已完成或失焦)。

我现在想要什么? 现在我基本上需要以下两个问题的帮助:-

  1. 我如何知道我的应用程序当前运行最多的活动是什么?
  2. 我如何知道活动是否仍在运行(即我想要像 isActicitAlive() (imaginary function) 这样的东西,它在 onResume()onPause() 的调用之间返回 true ?

我在活动中使用变量实现了 2 点,并将其设置为 onResume()onPause()。但是,这是唯一的方法吗?

【问题讨论】:

    标签: android android-activity


    【解决方案1】:
    ArrayList<String> runningactivities = new ArrayList<String>();
    
    ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE); 
    
    List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    
    for (int i1 = 0; i1 < services.size(); i1++) { 
        runningactivities.add(0,services.get(i1).topActivity.toString());  
    } 
    
    if(runningactivities.contains("ComponentInfo{com.app/com.app.main.MyActivity}")==true){
        Toast.makeText(getBaseContext(),"Activity is in foreground, active",1000).show(); 
    }
    

    通过这个,您可以检查您要查找的活动是否正在运行。

    esle,如果你想使用onStart()onStop()方法,可以使用下面的代码,

    class MyActivity extends Activity {
         static boolean active = false;
    
          @Override
          public void onStart() {
             super.onStart();
             active = true;
          } 
    
          @Override
          public void onStop() {
             super.onStop();
             active = false;
          }
    }
    

    【讨论】:

    • 我目前正在使用您回答的第二种方法。让我检查一下您的第一种方法的效率角度。时不时地查询 ActivityManager 听起来并不高效,至少对我来说……任何方式都感谢您的回答。
    • 经过一些更改后,我结束了您建议的选项。谢谢!!
    • @Amit:- :) 哪一个。?第一种还是第二种方法。?
    • 第二个.. 因为我发现它真的可以扩展.. 我用这些方法创建了 AnActivity,我的所有其他活动都扩展了这个 Activity。
    【解决方案2】:

    您可以使用service binding,以便只有您最顶层的活动绑定到服务。

    【讨论】:

    • 到目前为止,我的应用程序中没有使用服务。我需要为此使用它吗?
    • 对不起,我以为与服务器对话的后台线程是作为服务实现的,但如果不是,我不建议仅仅为此实现服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多