从其类中调用服务方法

时间:2013-01-26 18:50:22

标签: android broadcastreceiver android-service

我有一个服务,我可以从中设置我的ScreenReceiver课程。如果触发OnRecieve ScreenReceiver方法,我该如何通知服务?我希望在'onRecieve`被触发时调用update()方法。

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);
   }
    //...
}

2 个答案:

答案 0 :(得分:1)

你可以这样做:

Intent向您的Service创建一个新Receiver,传递Extra,然后在服务中覆盖onStartCommand()。检查Extra的意图,如果Extra存在,请致电update()

此外,如果您使用this代替this.getApplicationContext(),则Receiver的{​​{1}} onReceive()参数很可能是该服务。然后你可以施展。

例如

Context

答案 1 :(得分:1)

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

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类不知道或不关心。它只是调用监听器,如果有人注册的话。