相关疑难解决方法(0)

如何让Android服务与Activity通信

我正在编写我的第一个Android应用程序,并试图了解服务和活动之间的沟通.我有一个将在后台运行的服务,并执行一些基于gps和时间的日志记录.我将有一个用于启动和停止服务的活动.

首先,我需要能够在Activity启动时确定服务是否正在运行.这里还有其他一些问题,所以我想我可以搞清楚(但随意提供建议).

我的真正问题:如果Activity正在运行且服务已启动,我需要一种方法让服务向Activity发送消息.此时简单的字符串和整数 - 主要是状态消息.消息不会定期发生,因此如果有其他方法,我认为轮询服务不是一个好方法.我只想在用户启动Activity时进行此通信 - 我不想从服务启动Activity.换句话说,如果您启动Activity并且服务正在运行,那么当有趣的事情发生时,您将在Activity UI中看到一些状态消息.如果你没有启动Activity,你将看不到这些消息(它们并不那么有趣).

看起来我应该能够确定服务是否正在运行,如果是,则将Activity添加为侦听器.然后在"活动"暂停或停止时将"活动"作为侦听器删除.这有可能吗?我能想到的唯一方法是让Activity实现Parcelable并构建一个AIDL文件,这样我就可以通过Service的远程接口传递它.这看起来有点矫枉过正,我不知道Activity应该如何实现writeToParcel()/ readFromParcel().

有更简单或更好的方法吗?谢谢你的帮助.

编辑:

对于后来对此感兴趣的任何人,都有来自Google的示例代码,用于通过示例目录中的AIDL处理此问题:/apis/app/RemoteService.java

android android-service android-activity

245
推荐指数
8
解决办法
15万
查看次数

停止我的应用程序后,IntentService将被终止

我指的是android设计注意事项:AsyncTask vs Service(IntentService?)

根据讨论,AsyncTask不适合,因为它与您的Activity紧密"绑定"

所以,我启动一个Thread(我假设AsyncTask和Thread属于同一类别),在其中有一个无限运行循环并进行了以下测试.

  • 退出我的应用程序,按住后退软键,直到我看到主屏幕.线程仍在运行.
  • 我通过管理应用程序 - >应用程序 - >强制停止杀死我的应用程序.线程停止.

所以,我希望以后我是从改变ThreadService,我Service会继续我即使活着退出杀死我的应用程序.


Intent intent = new Intent(this, SyncWithCloudService.class);
startService(intent);
Run Code Online (Sandbox Code Playgroud)
public class SyncWithCloudService extends IntentService {
    public SyncWithCloudService() {
        super("SyncWithCloudService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        int i = 0;
        while (true) {
            Log.i("CHEOK", "Service i is " + (i++));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Log.i("CHEOK", "", …
Run Code Online (Sandbox Code Playgroud)

android

15
推荐指数
1
解决办法
1万
查看次数