我有一个服务,我可以从中设置我的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);
}
//...
}
答案 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类不知道或不关心。它只是调用监听器,如果有人注册的话。