如何将重新启动的活动连接到同一个应用程序中运行服务?

时间:2012-10-17 12:28:23

标签: java android service

我的应用程序包含在此服务上运行的主要活动,服务和多个线程。活动有1个按钮'启动服务'和其他UI。当用户按下按钮,按钮名称变为“停止服务”时,程序会创建新服务,存储有关CPU使用率的信息,并将存储的信息以每1秒的频率粘贴到TextVeiw。

让我们说我停止了主要活动。服务继续运行,但没有任何服务可以传递数据的活动。

1分钟后我再次启动主Activity。首先,我想看到上面提到的按钮状态(名称)'停止服务',我希望看到继续与我的新活动交谈的旧服务。

我不打算使用LocalBinderbindService(...);方法,因为我的服务保留在我自己的应用程序中。

任何解决方案?

1 个答案:

答案 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();
....
}

这是我们的服务,它实现了相同的接口GuiServiceBridgeItfMyService运行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(),其中返回truefalse  活动状态。换句话说,如果我们关闭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可以将按钮名称更新为“停止服务”并执行其他操作