拥有多功能服务的最佳方式是什么?

时间:2014-07-15 12:46:35

标签: java android android-intent service

好的,这里...我是Android编程的新手,我迫切需要方向。

我的最终结果是能够向我的service发送请求,并根据请求的内容,让它执行不同的操作。

示例1:用户按下活动中的刷新按钮,该按钮会下载信息然后将其显示出来。

示例2:用户导航到可以输入用户名和密码的活动中的登录片段。他预先显示了他当前保存的信息。

示例3:用户按下小部件,小部件下载信息,然后在小部件中显示一些信息。

希望我的想法得到了解决;将消费任务发送到服务,能够更新当前正在处理的任何显示。 services'任务取决于对它的要求(服务:我下载吗?我是否获取登录信息?我是否获取其他信息?), 必须 知道如何继续,一旦开始...这引出了我的问题:

如何告诉我的服务在调用后执行哪项任务? 此外,但不太重要的是,更新视图(小部件,活动)的最佳,最具代码效率的方法是什么?

背景资料:

  • 我决定使用服务来促进小部件和 活动。
  • 该服务执行要求苛刻的任务(下载,数据库 在AsyncTask
  • 上提取/保存等等
  • 我打电话给我的服务如下: Intent intent = new Intent(getActivity(), WorkerService.class); getActivity().startService(intent);

1 个答案:

答案 0 :(得分:1)

您可以使用BoundService

  

绑定服务是客户端 - 服务器接口中的服务器。绑定服务允许组件(例如活动)绑定到服务,发送请求,接收响应,甚至执行进程间通信(IPC)。绑定服务通常仅在其服务于另一个应用程序组件时才存在,并且不会无限期地在后台运行。

您有两种创建BoundService的方法:

1)使用活页夹 - 这可能就是你想要做的。

  

如果您的服务是您自己的应用程序的私有服务并且在该服务中运行   与客户端(这是常见的)相同的过程,你应该创建你的   接口通过扩展Binder类并返回一个实例   来自onBind()。客户端收到Binder并可以使用它   直接访问Binder中可用的公共方法   实施甚至服务。这是首选技术   当您的服务仅仅是您自己的后台工作者时   应用。这是你不创建界面的唯一原因   方式是因为您的服务被其他应用程序或跨越   单独的过程。

2)使用Messanger

请记住,该服务在UI(主)线程中运行。如果你进行持久的操作,你应该创建一个后台线程。

public class LocalService extends Service {
    // Binder given to clients
    private final IBinder mBinder = new LocalBinder();
    // Random number generator
    private final Random mGenerator = new Random();

    /**
     * Class used for the client Binder.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with IPC.
     */
    public class LocalBinder extends Binder {
        LocalService getService() {
            // Return this instance of LocalService so clients can call public methods
            return LocalService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    /** method for clients */
    public int getRandomNumber() {
      return mGenerator.nextInt(100);
    }
}