7

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

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

有什么标准的方法来完成它吗?

4

4 回答 4

19

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

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 
      }

我希望这可以帮到你!

于 2012-05-27T06:50:37.093 回答
4

如果您想通过您的活动(如果有任何正在运行)来处理传入的 Google Cloud 消息 (C2DM),或者如果没有任何活动正在运行,则下一个方法将很有效。

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

AndoroidManifest.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>

MyReceiver.java

public class StaticReceiver extends BroadcastReceiver {

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

我的活动.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

于 2014-03-27T12:46:10.683 回答
0

从这里复制。

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

class MyActivity extends Activity {
     static boolean active = false;

      public void onStart() {
         active = true;
      } 

      public void onStop() {
         active = false;
      }
}
于 2012-05-27T07:40:25.883 回答
0

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

Context context = MyActivity.this; 

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

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

于 2016-08-22T12:30:38.800 回答