在活动开始时随时获取流程/服务的当前状态

时间:2015-11-17 08:42:17

标签: android interface callback

我已经使意图服务及其一切正常。我已经制作了接口并进行了回拨。回调的是,收到以下3条消息:

  1. 服务开始: 当此消息到达时,我的"启动服务"按钮变为"停止服务"按钮。
  2. 服务已完成: 当此消息到达时,我的按钮消失
  3. 错误: 当此消息到达时,我的按钮变为"错误"按钮。
  4. 回电功能完美无缺。现在我在测试时发现了以下问题。这些都在

    之下

    问题:

    当我通过点击"启动服务"启动服务时按钮然后按钮变为"停止服务"按钮,但当我退出活动,然后回来时,S"顶级服务"按钮变回"开始服务"按钮。同样的,当服务完成"消息出现按钮消失,但稍后又回到活动状态,再次有一个按钮。

    我想要的是什么:

    我知道问题是什么,那就是" Callback"在事件发生时被调用。但是,我如何保存按钮的状态以获得持久性,或者如果有类似回调的东西来检查服务是否正在运行并获得当前状态呢?

    如果有这样的退房方式,请告诉我?我希望会有,请告诉我ans分享一个小例子。这将是很大的帮助。

    编辑一个:

    此外,我在将活动设置为结果接收器时遇到问题。我知道如何设置它是同一个类,但问题是我在启动活动中启动服务并尝试设置主要活动以获得结果,但它不允许看这里

      

    mReceiver = new DownloadResultReceiver(new Handler());               mReceiver.setReceiver(MainActivity.class); //得到错误

     mReceiver = new DownloadResultReceiver(new Handler());
                mReceiver.setReceiver(Spalsh.this);// no error
    

2 个答案:

答案 0 :(得分:0)

您只需要调用方法,该方法将在您的活动的onResume方法中检查服务的状态,如下所示。

 private boolean checkServiceStatus() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager
                .getRunningServices(Integer.MAX_VALUE)) {
            if (ServiceName.class.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

在onResume

 @Override
        protected void onResume() {
            super.onResume();
       boolean serviceStarted= checkServiceStatus();
    if (serviceStarted) {
        mSvcButton.setText("Service Running");
    } else {
        mSvcButton.setText("Service not Running ... Click to Start");
    }
    }

答案 1 :(得分:0)

你的问题: 但当我退出活动[onBackPressed();],然后回到[onCreate()]。这会将您活动中的所有内容重置为默认值。

解决方案: 您也可以在服务类中设置Flag并检查活动类的onResume或onCreate方法上的标志。例如:

posts/5

然后在您的活动中,您可以执行以下操作:

/posts/10

这种方法比在android os上运行服务列表迭代更快,以防你的用户手机正在运行大量服务。

对于BroadcastReceiver,您需要一个扩展BroadcastReceiver的类并实现该类的onReceive方法。例如:

public class HelloService extends Service {
   public static boolean isRunning = false;
   /** Called when the service is being created. */
   @Override
   public void onCreate() {
       this.isRunning = true;
   }

   /** The service is starting, due to a call to startService() */
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      return START_STICKY;
   }

   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }

   /** Called when The service is no longer used and is being destroyed */
   /* This method is not guaranteed to be called when android kill this service*/
   @Override
   public void onDestroy() {
       this.isRunning = false;
   }
}

现在您可以将接收器设置为此类的实例:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(HelloService.isRunning){ //this will also return false even when android kills your service
        myButton.setText("Stop Service");
    }
    else{
        myButton.setText("Start Service");
    }
}