android service笔记

1、service 默认在主线程运行,所以不能在service中直接做访问网络,操作文件等耗时操作,要另外开启线程

2、通过startservice开启的服务,一旦服务开启,这个服务和开启他的调用者之间就没有任何的关系了,调用者不可以访问 service里面的方法,调用者如果被系统回收了或者调用了ondestroy方法,service还会继续存在

3、通过bindService开启的服务,服务开启之后,调用者和服务之间还存在着联系,一旦调用者挂掉了,service也会跟着挂掉

4、service中可以使用 Toast

5、IntentService是自带一个线程的Service,可以自己关闭,一般用于完成后自动关闭的单线程工作任务

6、Service与Activity之间数据交互三种方式:

一,如果Activity调用Service的方法后能获取返回值,那Activity想什么时候从Service中获取信息就什么时候调用Service中的方法。但是,这种方法有局限性,因为Activity不知道Service中的信息什么时候更新,不能被动的接收信息。

二,利用广播接收者可以解决方法1的局限性,当Service中信息有更新时就发送一个广播到Activity中,Activity中注册一个广播接收者来接收广播,以此来更新Activity中的信息。但是有个疑问,假设频繁的发送广播会不会资源消耗大。

三,写一个回调接口
具体步骤如下:
1.先写一个用来做回调的接口
    public interface ICount {
        void count(int val);
    }
2.Service类
    public class CountService extends Service {
        private int val = 0;

public void startCount(ICount iCount){ // 调用CountActivity,因为CountActivity实现了ICount
            // do something ...
            val ++;
            iCount.count(val);
        }
    }
3.Activity类
注:省略了绑定CountService的代码
    public class CountActivity extends Activity implements ICount {
        @Override
        protected void onCreate(){
            // do something ...
            startCount(this); // 调用CountService对象的startCount()方法,并把自己传了进入,这样的话CountService对象就能调用自己的方法了
        }

@Override
        void count(int val){
            // update UI
        }
    }

7、binder可以通过调用transact来从activity发送数据到service,并从service返回数据

8、Service粘性和非粘性

启动service又分为粘性和非粘性:
(1)粘性service:关不掉,由于内存紧张关闭后会重新复活
(2)非粘性service:死了就死了。
区分粘性和非粘性的区别是:看onStartCommand的返回值。
如果在为返回之前系统崩溃,则不存在粘性和非粘性。
非粘性 :返回值是START_NOT_STICKY 系统杀死,再启动需要自己起startService
粘性:返回值START_STICKY 服务死了之后自己起,但是不是调用startSerivce,而是直接调用service的startCommand方法,所有传过来的intent为null.
返回值START_REDELIVER_INTENT: 死了之后系统自己起,但还是会传过来最后一个intent(由于最后一个导致死亡的,所以再传这个intent可能还会死亡,但是死了四五次就不会再自动启动了。)

9、进程间可以通过Messager进行通信

10、AIDL demo: http://git.oschina.net/atwal/androidAidlDemo

时间: 2024-08-28 00:55:21

android service笔记的相关文章

Android Service 笔记

从运行模式来看,Android的服务组件没有运行在独立的进程或线程中,而是和Android其他组件一样运行在进程的主线程中.所以直接在服务组件中同步执行耗时操作,将会阻塞主线程. 像Service的子类IntentService,完成构造函数和onHandleIntent(Intent intent)方法,然后就可以通过startService(intent)发送执行命令,IntentService接收到首个命令时,IntentService完成启动,并触发一个后台线程,然后将命令放入队列.In

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项目,在