systemUI为用户提供系统级别的信息显示与交互,如顶端的状态栏、底部的导航栏、最近任务列表等。systemui是以APK的形式存在系统,所以也是通过Activity、Service、BroadcastReceiver接受外界的请求及执行相关的操作。比较特殊的是状态栏、导航栏等组件的启动方式,他们需要在显示UI的时候不中断原来的Activity(播放视频、玩游戏等),所以其导航栏和状态栏是运行于一个叫SystemUIService的Service中。
参考文章: http://droidyue.com/blog/2015/08/16/dive-into-android-activity-launchmode/
参考文章: http://www.jianshu.com/p/e99b5e8bd67b http://www.cnblogs.com/hnrainll/archive/2011/11/14/2248564.html http://blog.csdn.net/droidpioneer/article/details/6706695
原文地址:http://blog.csdn.net/wzy_1988/article/details/51778755
Android IPC是Inter-Process Communication的缩写,即进程间通信或跨进程通信。在Android中,进程通常指一个应用或者Service,不同的应用之间正常情况下是不能相互访问的,所以就需要用到跨进程通信的方法。下面来介绍几种比较常见的IPC方法: Bundle : 三大组件(Activity、Service、Receiver)都支持在Intent中传递Bundle数据,Bundle实现了Paraelable接口,可以方便的在不同的进程间传输(通过在Intent中增加Bundle附加信息) 使用文件共享 : 这种方式使用于同一时间只有单线程读写。对于比较常用的SharePreference,它底层是基于xml实现,系统对于它的对写会基于缓存,在多线程模式下有很大几率丢失数据。 使用Messenger : 通过它可以在不同进场之间传递Message对象,在Message中放入需要传递的数据。它是一种轻量级的IPC方案,底层实现是AIDL,后面会详细介绍其实现方式。 使用AIDL : 主要用于调用远程服务的方法,也可以注册接口供不同进程之间使用,后面详细介绍。 使用ContentProvider : 它提供在多个应用程序之间数据共享的方式(跨进程共享数据),并允许其他应用程序对数据进行相关操作。Android系统本身也提供了很多ContentProvider,如音频、视频、联系人信息等。 具体可阅读这篇文章——Android ContentProvider Socket : 套接字,是网络通信中的概念。
ContentProvider概述 ContentProvider是Android四大组件之一,为存储和获取数据提供统一的接口,可以在不同的应用之间共享数据。数据的存储有很多中方式,比如SQLite和XML文件方式,但在不同的应用程序中,数据是不能直接被相互访问和操作的。 ContentProvider分为系统和自定义的,系统的如联系人、图片、音频、视频等 ContentProvider使用表来组织数据,提供方法如下: public boolean onCreate() :在创建ContentProvider时调用,只有在ContentProvider被第一次使用时才会被调用创建 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) :用于查询指定Uri的ContentProvider,返回一个Cursor。其中Projection是需要从ContentProvider中选择的字段(列映射别名,可以一致),如果为空,则返回所有的字段,sortOrder为默认的排序规则,其余参数同delete方法 public Uri insert(Uri uri, ContentValues values) :用于添加数据到指定Uri的ContentProvider中,values为需要添加数据的键值对 public int delete(Uri uri, String selection, String[] selectionArgs):用于删除指定URI的ContentProvider中的数据,其中selection为构成筛选添加的语句,如“id=1”或者“id=?”,selectionArgs为对应selection的两种情况传入null,或者new String[]{“1”},当然这两个参数都可以为null,可以由前面的URI指定对应id的数据。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):对 ContentProvider中的数据进行更新。values为需要更新的内容键值对(键为对应的字段,值为修改值)。 public String getType(Uri uri):返回当前Uri所代表数据的MIME类型,如果要数据的类型属于集合类型,则MIME类型字符串应该以vnd.android.cursor.dir/开头,否则应该以vnd.android.cursor.item/,可具体看后面的代码实例。
Android有两种方式使用Service:StartService和bindService。 要使用Service,首先要继承自Service,然后重写如下方法: onCreate : 第一次创建Service的时候调用一次,以后均不会再次调用。我们一般在onCreate方法中做初始化。 onStartCommand : 在onCreate后调用,多次执行startService也会多次调用该方法,在该方法中可根据传入的intent参数进行不同的操作。 onBind : 该方法主要用于给bindService调用Service,一般返回IBinder类。如果用不到,也要重写该方法,只需要将其返回null即可。 onDestroy : 通过StartService启动的Service会无限期运行,只有当调用了StopService或者StopSelf方法才会销毁。而对于bindService,一个Service可以同时和多个客户(组件,如Activity)绑定,只有当多个客户都解除绑定以后,系统才会销毁Service。要注意的是,当bindService将一个Service绑定以后,StopService或StopSelf实际上是不能停止这个Service,直到所有客户解绑。
序列化的定义 Android序列化是指将一个实例对象编码成字节流(序列化),并从字节流编码中重新构建对象实例的能力(反序列化)。