Android开发之浅谈Service的基本概况和常见问题

标签: android 开发 service | 发表时间:2014-04-07 01:00 | 作者:u013900875
出处:http://blog.csdn.net

    Service(服务)是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面。其他应用程序组件可以启动一个Serivce,它将继续在后台运行,即使用户切换到另一个应用程序。此外,一个组件可以绑定到一个服务与它交互,甚至执行进程间通信(IPC)。例如,一个Serivice可能处理网络交易,播放音乐,执行文件I / O,或与一个内容提供者交互,所有的背景。

   Serivice运行在哪里呢,这是一个常见的问题。Service在默认情况下运行在主线程的托管进程(当它不创建自己的线程和不运行在一个单独的进程)。这又意为着什么呢,,如果您的服务将做任何CPU密集型工作或阻塞操作(如MP3播放或网络),您应该创建一个新线程内的服务工作。通过使用一个单独的线程,您将减少风险的应用程序没有响应”(ANR)错误和应用程序的主线程可以仍然致力于用户交互活动,可以进行UI的交互。

   什么时候应该使用Service而什么时候应该使用线程(Thread)呢,Service是一个简单的组件,可以在后台运行,即使用户没有与应用程序交互,它也可以运行,因此,您如果创建一个service的情况应该是只用它运行就好不用于界面交互。

   如果您需要执行工作在你的主线程外,但只有在用户与应用程序交互中运行,那么你应该而不是创建一个新的线程,而不是Service。例如,如果你想播放一些音乐,但只有当你的活动正在运行,您可以创建一个线程在onCreate(),在onStart()开始运行它,然后停止在onStop()。也可以考虑使用AsyncTask或HandlerThread,而不是传统的线程类。

    Service自己会关闭吗?当启动一个Service,它有一个独立的生命周期开始它的组件和服务可以无限期地在后台运行,即使开始它的组件被摧毁。因此,Service应该停止本身当它的工作是通过调用stopSelf(),或者另一个组件可以阻止它通过调用stopService()。

    Service跟一个Activity一样,有自己的生命周期回调方法,您可以实现监控服务的状态变化,在适当的时间执行工作。如下面的框架所示演示了每个生命周期方法。

public class ExampleService extends Service {
    int mStartMode;       // indicates how to behave if the service is killed
    IBinder mBinder;      // interface for clients that bind
    boolean mAllowRebind; // indicates whether onRebind should be used

    @Override
    public void onCreate() {
        // The service is being created
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed
    }
}



 onStartCommand()

           系统调用这个方法当另一个组件,比如一个Activity,要求服务启动,通过调用由startService()。此方法执行后,Service启动,可以在后台运行下去。如果你实现这个,你必须自己在停止Service工作完成后,通过调用stopSelf()或stopService()。(特别提醒:如果你只是想提供绑定,您不需要实现此方法)。

onBind()

     系统调用该方法当另一个组件想绑定的Service(如执行RPC),通过调用bindService()。在你实现这种方法,您必须提供一个接口,客户使用与服务进行通信,通过返回一个IBinder。你必须实现这个方法,但是如果你不希望允许绑定,那么我们应该返回null。

onCreate()

    当系统第一次调用Service的时候,会调用这个方法,只调用那么一次。

 此外,跟Acitivity一样,Service需要声明在清单文件中,如下面所示

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

   接下来我还会详细的跟大家分享Service的具体使用案例,请各位敬请期待。



作者:u013900875 发表于2014-4-6 17:00:10 原文链接
阅读:78 评论:0 查看评论

相关 [android 开发 service] 推荐:

Android Service 详解

- - CSDN博客移动开发推荐文章
一个Service也是一种应用程序组件,它运行在后台以提供某种服务,通常不具有可见的用户界面. 其它的应用程序组件可以启动一个Service,即使在用户切换到另外一个应用程序后,这个Service还是一直会在后台运行. 此外,一个应用程序也可以绑定到一个Service然后使用进程间通信(IPC)方式与Service之间发生交互.

Android开发——关于Service的一些要点

- - CSDN博客推荐文章
service 有两种调用形式:被启动(startService)和被绑定(bindService). 前者要求在Service类中实现onStartCommand方法,Service启动后需要手动停止,否则永远运行下去;后者要求实现onBind方法,当没有组件绑定到此Service时,它自行了断.

Android学习之路——7.Service

- - ITeye博客
这两天又学习了Android四大组件之一的Service. (1)Service不是一个单独的Process,除非特别指派了,也不是一个Thread,但也不是运行在Main Thread中. (3)Service的生命周期:. 调用的Context.startService()   oncreate() --> onStartCommand ()--> Service is running --> The service is stopped by its or a client--> onDestroy() --> Service is shut down .

Android Activity与Service通信

- - CSDN博客移动开发推荐文章
一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现.      当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用. 比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信.

Android开发之浅谈Service的基本概况和常见问题

- - CSDN博客移动开发推荐文章
    Service(服务)是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面. 其他应用程序组件可以启动一个Serivce,它将继续在后台运行,即使用户切换到另一个应用程序. 此外,一个组件可以绑定到一个服务与它交互,甚至执行进程间通信(IPC). 例如,一个Serivice可能处理网络交易,播放音乐,执行文件I / O,或与一个内容提供者交互,所有的背景.

Android Service的使用方法 音乐播放器实例

- - ITeye博客
Service翻译成中文是服务,熟悉Windows 系统的同学一定知道很熟悉了. Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行,避免被用户误关闭. 因为Android在某些情况下会自动关闭非前台显示的Activity,所以如果要让一个功能在后台一直执行,不被Android系统关闭,比如说闹钟、后台播放音乐,就必须使用Service.

Android Service与Activity之间通信的几种方式

- - CSDN博客移动开发推荐文章
转载请注明地址 http://blog.csdn.net/xiaanming/article/details/9750689. 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢.

android service常驻内存的一点思考

- - CSDN博客推荐文章
我们总是不想自己的Android service被系统清理,以前时候大家最常用的办法就是在JNI里面fork出子进程,然后监视 service进程状态,被系统杀死了就重启它.. 我分别在android4.3和android5.0上面测试了LBE的清理内存功能,看看是不是会达到不被清理的目的,发现在这两个版本上还是有一些区别的.

Android的Service中弹出窗口解决方法

- - 移动开发 - ITeye博客
转于:http://www.cnblogs.com/fbsk/archive/2011/12/28/2304523.html. 我们在使用Service时,经常会碰到这样的情况,比如用一个service做下载.此时service不一定在最前端,有可能是其它的Activity. 当下载完成时,如何能弹出对话框,让弹出框在当前activity之上.

SPRING BOOT OAUTH2 + KEYCLOAK - service to service call

- - BlogJava-首页技术区
employee-service调用department-service,如果要按OAUTH2.0流程,只需要提供client-id和client-secrect即可. 在KEYCLOAK中引入service-account,即配置该employee-service时,取消standard-flow,同时激活service-account.