これは広範なコード例です。
開始時に、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つのスレッドを実行します:
1つのスレッドがいくつかのロジックを実行します(この場合、CPUのアクティビティを毎秒通知します)
2つ目は、サービスが実行されている場合にメインアクティビティに通知します(サービスが実行されているかどうかを確認するために、このタスクをアクティビティに提供する方がよい場合があります)
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()
返します。つまり、Activityを停止すると、そのインスタンスをApplicationから登録解除します。メインアクティビティのメソッドがリセットされるため。true
false
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はボタン名を「サービスの停止」に更新して他のことを行うことができます