从类中调用服务方法(Calling service method from its class)

2019-09-28 05:07发布

我从我instationate我的服务ScreenReceiver类。 我怎样才能通知服务时OnRecieve的方法ScreenReceiver被触发? 我想要update()时,“onRecieve`被trigerred被调用的方法。

StateChecker.java(草案):

public class StateChecker extends Service {
   //...
   // setting TimeAlarm
   TimeAlarm mTimeAlarm = new TimeAlarm();
   mTimeAlarm.SetAlarm(this.getApplicationContext(),10);

   public void update() {
   //update sth
   }
   //...
}

ScreenReceiver.java(草案):

public class ScreenReceiver extends BroadcastReceiver {
    //...   

   @Override
   public void onReceive(Context context, Intent intent) {
    //...
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
   }
    //...
}

Answer 1:

你也许可以做这样的事情:

创建一个新的Intent ,以您的ServiceReceiver ,通过关闭额外的,然后覆盖onStartCommand()的服务。 检查目的的额外的,如果额外存在,调用update()

另外,如果你用this来代替this.getApplicationContext()它很可能是你的ReceiveronReceive() Context参数将是服务。 然后,你可以只投。

例如

if (context instanceof StateChecker)
  ((StateChecker) context).update();


Answer 2:

定义一个接口,并使用一个回调,让活动知道,一个屏幕事件已收到。

public Interface ScreenReceiverListener {
    void onScreenReceive(int arg1, string arg2); ..<----add arguments you want to pass back
}

在你ScreenReceiver类

ArrayList<ScreenReceiveListener > listeners = new ArrayList<ScreenReceiveListener >();

...

public void setScreenReceiveListener(ScreenReceiveListener listener){
    listeners.add(listener);
}

在你的onReceive

for (ScreenReceiveListener listener:listeners){
   listener.onSCreenReceive(arg1, arg2);
}

在您的服务:

public class StateChecker extends Service implements ScreenReceiveListener {

    ...

    screenReceiver.setScreenReceiveListener(this);

    ...
}

public void onScreenReceive(int arg1, string arg2){
   // do whatever you need to do
}

所有的记忆,所以请原谅错别字,你应该加入removeScreenReceiveistener并检查你不setScreenReceiveListener添加相同的听众两次提高ScreenReceiver类。

注意。 由于您使用的接口,任何类(不只是一个服务)可以实现,所以你可以在你的应用的任何更新。 该ScreenReceiver类并不知道也不关心。 它只是调用监听器,如果有任何登记。



文章来源: Calling service method from its class