我的应用程序包含在此服务上运行的主要活动,服务和多个线程。活动有1个按钮'启动服务'和其他UI。当用户按下按钮,按钮名称变为“停止服务”时,程序会创建新服务,存储有关CPU使用率的信息,并将存储的信息以每1秒的频率粘贴到TextVeiw。
让我们说我停止了主要活动。服务继续运行,但没有任何服务可以传递数据的活动。
1分钟后我再次启动主Activity。首先,我想看到上面提到的按钮状态(名称)'停止服务',我希望看到继续与我的新活动交谈的旧服务。
我不打算使用LocalBinder
和bindService(...);
方法,因为我的服务保留在我自己的应用程序中。
任何解决方案?
答案 0 :(得分:0)
这是一个广泛的代码示例。
一开始,Activity将实例呈现给Application。我们的应用程序将存储主要活动的实例(或者换句话说,活动界面)
请参阅GuiServiceBridgeItf gsb
摘要应用程序类
public class MyApplication extends Application{
private static mYApplication mSingleton;
public GuiServiceBridgeItf gsb = null;
@Override
public void onCreate() {
super.onCreate();
mSingleton = this;
}
public mYApplication getApp(){
return mSingleton;
}
....
}
GuiServiceBridgeItf 界面
public interface GuiServiceBridgeItf {
public void onEventReceived(String str);
/** Notify activity about service run */
public void imHere();
....
}
这是我们的服务,它实现了相同的接口GuiServiceBridgeItf
。
MyService
运行2个主题:
一个线程运行一些逻辑(在我们的例子中,每秒在CPU上通知Activity)
如果服务运行,则第二个通知主要活动(可能更好地向Activity提供此任务以询问服务是否运行)
public class MyService extends Service implements GuiServiceBridgeItf {
....
private RunnerThread runner = null;
private CheckAliveThread checkalive = null;
private MyApplication mMyApp = null;
public void onCreate() {
super.onCreate();
mMyApp = (MyApplication)getApplicationContext();
}
public int onStartCommand(Intent intent, int flags, int startId) {
GuiServiceBridgeItf gui2ServiceTalker = this;
checkalive = new CheckAliveThread();
checkalive.init(mMyApp);
checkalive.start();
runner = new RunnerThread(this.getApplicationContext(), gui2ServiceTalker);
runner.start();
...
return START_STICKY;
}
public void onDestroy() {
super.onDestroy();
...
runner.doDestroy();
runner = null;
checkalive.doDestroy();
checkalive = null;
stopSelf();
}
private boolean isInstanceActive(){
if(mMyApp.gsb == null){
return false;
}
return true;
}
public void imHere() {}
public void onEventReceived(String str) {
if(isInstanceActive()){
mMyApp.gsb.onEventReceived(str);
}
}
...
}
此处的主要方法是:boolean isInstanceActive()
,其中返回true
或false
活动状态。换句话说,如果我们关闭Activity,我们从Application取消注册它的实例。因为主Activity中的onDestroy
方法会重置MyApplication.gsb
。
另一方面,当我们重新启动新活动时,我们再次向应用程序注册,(见下文)
public class LauncherUI extends Activity implements GuiServiceBridgeItf{
....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// register Activity to Application
GuiServiceBridgeItf gts = this;
mApplicationApp = (MyApplication)mContext.getApplicationContext();
mApplicationApp .gsb = gts;
....
}
....
@Override
protected void onDestroy() {
super.onDestroy();
....
// Unregister Activity to prevent to Service to talk with
mMyApplication.gsb = null;
}
}
服务通过使用他的线程验证活动已注册到应用程序,因此继续通知新生活动有关CPU更改。现在,Activity可以将按钮名称更新为“停止服务”并执行其他操作