发现Android活动是否正在运行

问题描述 投票:6回答:4

我正在使用C2DM,我的BroadcastReceivers将C2DM事件传播到本地服务。该服务通过将id发送到我的webserver来完成注册,它负责让设备知道新消息,但是如果应用程序(其中一个活动)已启动,我们希望用新数据向该活动发送意图,它可以更新,如果不是NotificationManager用于通知用户。

问题是,如何知道活动正在运行? Application对象不是一个选项,因为Service是应用程序的一部分,它显然会出现。在每个应用程序的onDesroy中取消注册也不是一个选项,因为它可能会在方向更改中发生...

完成任何标准方法吗?

android android-activity android-c2dm
4个回答
18
投票

解决方案1:您可以使用ActivityManager检查活动是否正在运行:

public boolean isActivityRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isActivityFound = false; 
    for (int i = 0; i < activitys.size(); i++) { 
        if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.example.testapp/com.example.testapp.Your_Activity_Name}")) {
            isActivityFound = true;
        }
    } 
    return isActivityFound; 
} 

需要为您的清单添加权限..

<uses-permission  android:name="android.permission.GET_TASKS"/>

解决方案2:您可以在活动中使用静态变量来检查它是否正在运行,并将其存储在服务或广播接收器访问的位置:

static boolean CurrentlyRunning= false;
      public void onStart() {
         CurrentlyRunning= true; //Store status of Activity somewhere like in shared //preference 
      } 
      public void onStop() {
         CurrentlyRunning= false;//Store status of Activity somewhere like in shared //preference 
      }

我希望这可以帮到你!


4
投票

如果您希望通过活动处理传入的Google Cloud消息(C2DM)(如果有正在运行),则下一种方法可以正常工作,或者如果没有活动正在运行则发出通知。

在清单文件中注册一个BroadcastReceiver。应用程序未运行时,此接收器将处理C2D消息。在您的活动中以编程方式注册另一个BroadcastReceiver。每当活动运行时,此接收器将处理C2D消息。

Android dあぇst。 XML

<receiver
    android:name=".StaticReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.mypackage" />
    </intent-filter>
</receiver>

my receiver.Java

public class StaticReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Trigger a Notification
    }
}

my activity.Java

public class MyActivity extends ActionBarActivity {

    @Override
    protected void onResume() {
    super.onResume();

        final IntentFilter filter = new 
                IntentFilter("com.google.android.c2dm.intent.RECEIVE");
        filter.addCategory("com.mypackage");
        filter.setPriority(1); 
        registerReceiver(dynamicReceiver, filter, 
                "com.google.android.c2dm.permission.SEND", null);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(dynamicReceiver);
    }

    private final BroadcastReceiver dynamicReceiver 
            = new BroadcastReceiver() 
    {
        @Override
        public void onReceive(Context context, Intent intent) {

            // TODO Handle C2DM

            // blocks passing broadcast to StaticReceiver instance
            abortBroadcast();
       }
    };
}

注意!要首先捕获广播,dynamicReceiver IntentFilter的优先级必须高于StaticReceiver实例IntentFilter的优先级(默认优先级为'0')。

PS。看起来Google Cloud Messaging Service发布的广播是有序广播。原创作者:CommonsWare


1
投票

检查活动是否正在运行的最简单方法是:

Context context = MyActivity.this; 

if (! ((Activity) context).isFinishing()) {
    //  Activity is running
} else {
    //  Activity has been finished
}

注意:如果活动未运行,则不应执行任何与UI相关的操作。


0
投票

复制自here

您可以在活动中使用静态变量。

class MyActivity extends Activity {
     static boolean active = false;

      public void onStart() {
         active = true;
      } 

      public void onStop() {
         active = false;
      }
}
© www.soinside.com 2019 - 2024. All rights reserved.