我有一个服务和应用程序。它们之间通过在特定情况下发送意图来进行通信。在活动中,我注册和注销广播接收器以收集此意图。当执行特定的回调方法时,来自服务的意图正在发送。是否有可能仅在活动处于前台时才发送此意图?因为当这是隐藏时,不需要收集这个意图(它只有助于实时显示一些情况)?我发现在活动中可能是指示这种情况的静态字段,但我不知道如何从服务中访问活动,另外我发现这是不同的不良设计实践的信息。感谢您的任何建议!
问问题
82 次
3 回答
0
您可以在活动中使用静态变量。
class MyActivity extends Activity {
static boolean active = false;
@Override
public void onStart() {
super.onStart();
active = true;
}
@Override
public void onStop() {
super.onStop();
active = false;
}
}
添加只是签到服务为
if(MyActivity.active)
{
//send broadcast.
}
或者用这个来检查活动的状态是否处于活动状态
public boolean isRunning(Context ctx) {
ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
for (RunningTaskInfo task : tasks) {
if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName()))
return true;
}
return false;
}
于 2013-09-30T10:48:35.897 回答
0
我会在服务中有一个本地布尔变量:
protected boolean mIsAppRunning;
startService()
应用程序恢复/停止时使用 true/false 额外调用:
@Override
protected void onResume() {
super.onResume();
Intent service = new Intent("my.service.ACTION");
service.putExtra("IS_MY_ACTIVITY_RUNNING", true);
startService(service);
}
@Override
protected void onPause() {
Intent service = new Intent("my.service.ACTION");
service.putExtra("IS_MY_ACTIVITY_RUNNING", false);
startService(service);
}
检查服务中的额外内容onStartCommand()
并将其值分配给mIsAppRunning
:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
mIsAppRunning = intent.getBooleanExtra("IS_MY_ACTIVITY_RUNNING", false);
}
return START_STICKY;
}
如果稍微仔细设计服务中的逻辑,甚至可以去掉局部变量 ,mIsAppRunning
并根据意图附加值调用所需的方法。
希望这可以帮助。
于 2013-09-30T12:22:10.020 回答
0
在你的声明这个Activity
:
public static boolean isRunning;
然后在你onPause
设置isRunning = false;
并将onResume
其设置为isRunning = true;
然后从你那里Service
你可以简单地打电话ActivityName.isRunning
知道它是否在前台!
于 2013-09-30T10:43:22.327 回答