仅在活动运行时将意图从服务发送到活动

时间:2013-09-30 10:39:29

标签: java android android-intent ipc

我有服务和申请。他们之间通过发送特定情况的意图进行沟通。在活动中,我注册并取消注册广播接收器以收集此意图。当执行特定的回调方法时,来自服务的意图正在发送。是否有可能仅在活动位于前台时发送此意图?因为当这是隐藏时,没有必要收集这个意图(它只是为了实时显示某些情况)?我发现活动可能是静态字段,表明这种情况,但我不知道如何从服务访问活动,另外我发现这是不同的设计做法的信息..感谢任何建议!

3 个答案:

答案 0 :(得分:0)

Activity

中声明此内容
public static boolean isRunning;

然后在onPause设置isRunning = false;

并在onResume中将其设置为isRunning = true;

然后,从您的Service,您只需致电ActivityName.isRunning即可知道它是否在前台!

答案 1 :(得分: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.
}

OR 与此一起检查活动的状态是否有效

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;
    }

答案 2 :(得分:0)

我在服务中有一个本地布尔变量:

protected boolean mIsAppRunning;

当应用程序恢复/停止时,使用true / false extra调用startService()

@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,并根据意图额外值调用所需的方法。

希望这有帮助。