1

我有一项服务,我可以从该服务中恢复我的ScreenReceiver班级。触发OnRecieve方法时如何通知服务?ScreenReceiver我希望在update()触发“onRecieve”时调用该方法。

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

2 回答 2

1

您可能可以执行以下操作:

从 中创建一个新Intent的,传递一个 Extra,然后在服务中覆盖。检查 Extra 的意图,如果 Extra 存在,则调用.ServiceReceiveronStartCommand()update()

此外,如果您使用this而不是,您的参数this.getApplicationContext()很可能是服务。然后你就可以投了。ReceiveronReceive() Context

例如

if (context instanceof StateChecker)
  ((StateChecker) context).update();
于 2013-01-26T18:54:43.410 回答
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 类不知道也不关心。它只是调用侦听器,如果有的话。

于 2013-01-26T18:59:08.470 回答