Android Service 笔记

从运行模式来看,Android的服务组件没有运行在独立的进程或线程中,而是和Android其他组件一样运行在进程的主线程中。所以直接在服务组件中同步执行耗时操作,将会阻塞主线程。

像Service的子类IntentService,完成构造函数和onHandleIntent(Intent intent)方法,然后就可以通过startService(intent)发送执行命令,IntentService接收到首个命令时,IntentService完成启动,并触发一个后台线程,然后将命令放入队列。IntentService会顺序执行这些命令,并同时为每一条命令在后台线程上调用onHandleIntent(intent)的方法。当执行完队列的所有命令后,服务也随即停止并被销毁。PS:IntentService是一种non-sticky服务。

non-sticky服务:当服务自己认为已经完成任务时,会调用stopSelf()或者stopSelf(int)方法告诉Android任务已经完成,以结束服务。

sticky服务:服务会持续运行,直到某个组件调用Context.stopService(Intent)让它停止。

Service的生命周期

一、Context.startService

当首次启动服务时,会依次调用onCreate()和onStart(),如果服务已经被创建,再调用startService(intent)

就只会执行onStart()。Intent传递过来的参数可以在onStartCommand()方法中进行处理。主动结束时执行

stopSelf()方法,被动结束调用Context.stopService()方法,然后再执行onDestroy()。

二、Context.bindService

    如果客户端想持续连接服务,获取服务实例可以使用绑定服务这种方式。

同样首次创建服务时,会调用onCreate(),然后onBind方法会构造一个IBinder对象返回给调用者,建立通信连

接,调用者通过重写ServiceConnection类中的onServiceConnected()方法可以获取此IBinder对象。通过

onUnBind解绑服务,然后再执行onDestroy()。绑定服务的组件在销毁前应解除绑定,否则会造成内存泄

露。

部分代码如下:

Service端

public class MyService extends Service {
    private static final String TAG = "MyService";
    private MyBinder mBinder = new MyBinder();
	// 创建一个Binder对象,通过onBinder返回给调用者,调用者再通过此对象得到该服务实例
    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG, "start IBinder~~~");
        return mBinder;
    }
    @Override
    public void onCreate() {
        Log.e(TAG, "start onCreate~~~");
        super.onCreate();
    }  

    @Override
    public void onDestroy() {
        Log.e(TAG, "start onDestroy~~~");
        super.onDestroy();
    }  

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e(TAG, "start onUnbind~~~");
        return super.onUnbind(intent);
    }  

    //为服务创建一个公共方法,用于测试
    public String test(){
          System.out.println("test");
    }  

    public class MyBinder extends Binder{
        MyService getService(){
            return MyService.this;
        }
    }
}  

调用端:

public class ServiceDemo extends Activity {  

    private ServiceConnection mServiceConnection = new ServiceConnection() {  

        public void onServiceConnected(ComponentName name, IBinder service) {  

            mMyService = ((MyService.MyBinder)service).getService();
			mMyService.test(); // 直接调用服务实例的公共方法
        }  

        public void onServiceDisconnected(ComponentName name) {  

        }
    };  

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		Intent i  = new Intent();
        i.setClass(ServiceDemo.this, MyService.class);
        mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
	}     

}  
时间: 2024-08-30 10:16:56

Android Service 笔记的相关文章

android service笔记

1.service 默认在主线程运行,所以不能在service中直接做访问网络,操作文件等耗时操作,要另外开启线程 2.通过startservice开启的服务,一旦服务开启,这个服务和开启他的调用者之间就没有任何的关系了,调用者不可以访问 service里面的方法,调用者如果被系统回收了或者调用了ondestroy方法,service还会继续存在 3.通过bindService开启的服务,服务开启之后,调用者和服务之间还存在着联系,一旦调用者挂掉了,service也会跟着挂掉 4.service

Android学习笔记(五三):服务Service(下)- Remote Service

之前所谈的Service属于Local Service,即Service和Client在同一进程内(即同一application内),Service的生命周期服从进程的生命周期.在实际应用上,有时希望Service作为后台服务,不仅被同一进程内的activity使用,也可被其他进程所使用,针对这种情况,需要采用bindService,也就是Remote Service的方式. 在Android中,不同app属不同进程(process),进程是安全策略的边界,一个进程不能访问其他进程的存储(例如采

Android学习笔记五之Service

Android学习笔记五之Service 1.什么是Service? 什么是Service?Service是Android系统的四大组件之一,官方文档是这样描述Service的: A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application comp

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

Android开发笔记--hello world 和目录结构

原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SDK Manager更新 3.接着运行就可以了 第一次启动要1分多钟 不要关 4.添加代码 5.接着在运行就OK了 目录结构 1.src - 用于放置源程序 2.gen - 自动生成 R.java 文件,用于引用资源文件(即 res 目录下的数据) 3.assets - 用于放置原始文件,Androi

Pro Android学习笔记(十):了解Intent(上)

Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent基本含义 intent是通知平台处理(唤起)的动作.Android唤起的动作将取决于注册了什么动作.例如我们有个简单的Activity:IntentBaiscViewActivity.在AndroidManife

Android学习笔记:Home Screen Widgets(2):关于Widget

通过widget定义,我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时,假设在appwidet-provider中定义了android:configure的java类,在widget实例创建后会立即唤起配置activity. 这个activity主要完毕两个任务:1.配置初始化数据:2.将配置数据适配到widget实例中. 利用preference中存贮配置数据 widget数据能够保持在文件.Share preference,或者SQLite3中.wid

Android学习笔记(三四):再谈Intent(上)-一些知识

在Android学习笔记(七):多个Activity和Intent中,我们先在学会了如何使用intent在代码中唤起activity.此处作深一步地学习. 什么是Intent intent是对一个操作处理的抽象描述.context可以在使用startActivity(intent)来launch一个actvivity,就如我们在学习笔记(七)中的处理,也是最常用的方式,将activity在我们的应用中整合:可以在通过sentBroast(intent)来广播给任何有兴趣的BroadcastRec

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在