我正在使用C2DM,我的BroadcastReceivers将C2DM事件传播到本地服务。该服务通过将id发送到我的webserver来完成注册,它负责让设备知道新消息,但是如果应用程序(其中一个活动)已启动,我们希望用新数据向该活动发送意图,它可以更新,如果不是NotificationManager用于通知用户。
问题是,如何知道活动正在运行? Application对象不是一个选项,因为Service是应用程序的一部分,它显然会出现。在每个应用程序的onDesroy中取消注册也不是一个选项,因为它可能会在方向更改中发生...
完成任务的标准方法是什么?
答案 0 :(得分: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
}
我希望这有用!
答案 1 :(得分: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
}
}
MyActivity.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
答案 2 :(得分:0)
从here复制。
您可以在活动中使用静态变量。
class MyActivity extends Activity {
static boolean active = false;
public void onStart() {
active = true;
}
public void onStop() {
active = false;
}
}
答案 3 :(得分:0)
检查活动是否正在运行的最简单方法是:
Context context = MyActivity.this;
if (! ((Activity) context).isFinishing()) {
// Activity is running
} else {
// Activity has been finished
}
注意:如果活动未运行,则不应执行任何与UI相关的操作。