我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中persistent属性用法详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中persistent属性用法详解

本文实例讲述了Android中persistent属性用法。分享给大家供大家参考,具体如下:

前段时间在研究telephony时,一直没有在framework下发现对telephony的初始化(PhoneFactory.Java中的makeDefaultPhones函数)的调用。结果全局搜索之后发现在application PhoneApp(packages/apps/Phone)中调用了。但是application PhoneApp既没有被Broadcast唤醒,也没有被其他service调用,那么是Android是通过什么方式来启动PhoneApp,所以就发现了属性android:persistent。

在AndroidManifest.xml定义中,application有这么一个属性android:persistent,根据字面意思来理解就是说该应用是可持久的,也即是常驻的应用。其实就是这么个理解,被android:persistent修饰的应用会在系统启动之后被AM启动。

AM首先去PM(PackageManagerService)中去查找设置了Android:persistent的应用


public void systemReady(final Runnable goingCallback) {
  if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
    try {
      List apps = AppGlobals.getPackageManager().
        getPersistentApplications(STOCK_PM_FLAGS);
      if (apps != null) {
        int N = apps.size();
        int i;
        for (i=0; i<N; i++) {
          ApplicationInfo info
            = (ApplicationInfo)apps.get(i);
          if (info != null &&
              !info.packageName.equals("Android")) {
            addAppLocked(info);
          }
        }
      }
    } catch (RemoteException ex) {
      // pm is in same process, this will never happen.
    }
  }
}

假如该被Android:persistent修饰的应用此时并未运行的话,那么AM将调用startProcessLocked启动该app,关于startProcessLocked不再描述,另外一篇文章《How to start a new process for Android?》中做了详细的介绍(这篇英文文档小编就不翻译了,感兴趣的朋友可以搜到看一看)。

app的启动过程就是启动app所在的package对应的进程。


final ProcessRecord addAppLocked(ApplicationInfo info) {
    ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);
    if (app == null) {
      app = newProcessRecordLocked(null, info, null);
      mProcessNames.put(info.processName, info.uid, app);
      updateLruProcessLocked(app, true, true);
    }
    if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
        == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
      app.persistent = true;
      app.maxAdj = CORE_SERVER_ADJ;
    }
    if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
      mPersistentStartingProcesses.add(app);
      startProcessLocked(app, "added application", app.processName);
    }
    return app;
}

面介绍app所在的package对应的进程启动完成之后,app是如何被create的。

从文章《How to start a new process for Android?》中可知,zygote在创建新的进程均会启动它的mainThread android.app.ActivityThread,因此我们从ActivityThread的main函数中接着分析app的create过程。

在main中有下面这个操作


thread.attach(false);

在attach过程中,ActivityThread会将对应的application attach到AM中去,交与AM去管理。这里需要注意一个变量


final ApplicationThread mAppThread = new ApplicationThread();

mAppThread是一个ApplicationThread对象,mAppThread可以看作是当前进程主线程的核心,它负责处理本进程与其他进程(主要是AM)之间的通信,同时通过attachApplication将mAppThread的代理Binder传递给AM。


private final void attach(boolean system) {
    sThreadLocal.set(this);
    mSystemThread = system;
    if (!system) {
      ViewRoot.addFirstDrawHandler(new Runnable() {
        public void run() {
          ensureJitEnabled();
        }
      });
      Android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");
      RuntimeInit.setApplicationObject(mAppThread.asBinder());
      IActivityManager mgr = ActivityManagerNative.getDefault();
      try {
        mgr.attachApplication(mAppThread);
      } catch (RemoteException ex) {
      }
    }
}

上面的attach代码中,我们顺着IPC调用AM的attachApplication过程再往下看。
在该过程中,AM调用到了IPC通信调用mAppThread的bindApplication;


private final boolean attachApplicationLocked(IApplicationThread thread,
  int pid) {
  thread.bindApplication(processName, app.instrumentationInfo != null
      ? app.instrumentationInfo : app.info, providers,
      app.instrumentationClass, app.instrumentationProfileFile,
      app.instrumentationArguments, app.instrumentationWatcher, testMode,
      isRestrictedBackupMode || !normalMode,
      mConfiguration, getCommonServicesLocked());
  updateLruProcessLocked(app, false, true);
  app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();
}

mAppThread的bindApplication再通过消息机制向ActivityThread自身维护的handler发送BIND_APPLICATION消息。下面看看ActivityThread自身维护的handler对消息BIND_APPLICATION的处理,最终会调用到handleBindApplication函数

你会发现在handleBindApplication函数中有这么一句


mInstrumentation.callApplicationOnCreate(app);

我们最终在绕了好大一圈之后,调用了app的onCreate函数来启动这个application。

PS:更多关于AndroidManifest.xml配置项及其功能可参考本站在线工具:

Android Manifest功能与权限描述大全:
http://tools.jb51.net/table/AndroidManifest

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android数据库操作技巧总结》、《Android编程之activity操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

您可能感兴趣的文章:Android源码系列之深入理解ImageView的ScaleType属性Android EditText常用属性功能汇总Android中LinearLayout布局的常用属性总结图文讲解Android的ImageView类中的ScaleType属性设置详解Android自定义控件属性TypedArray以及attrsAndroid开发之使用ExifInterface获取拍照后的图片属性Android编程开发之EditText中inputType属性小结Android编程开发之TextView文字显示和修改方法(附TextView属性介绍)Android中的windowSoftInputMode属性详解浅析Android中的visibility属性android教程之intent的action属性使用示例(intent发短信)android ListView 一些重要属性详解


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中persistent属性用法详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中persistent属性用法详解

本文实例讲述了Android中persistent属性用法。分享给大家供大家参考,具体如下: 前段时间在研究telephony时,一直没有在framework下发现对telephony的初始化(PhoneFactory.Java中的make
2022-06-06

Android中的windowSoftInputMode属性详解

在前面的一篇文章中,简单的介绍了一下如何实现软键盘不自动弹出,使用的方法是设置android:windowSoftInputMode属性。那么,这个属性到底是干什么的,他有什么作用呢?今天这篇文章,就是探索android:windo
2022-06-06

android 布局属性详解

android:id 为控件指定相应的ID android:text 指定控件的文本,置尽量使用strings.xml android:grivity 指定控件的基本位置 ,比如举重,居右, android:padding 指定控件的内边距
2022-06-06

详解javascript中offsetleft属性的用法

offsetLeft属性是JavaScript中DOM元素的一个属性,用于获取一个元素相对于其父元素的水平偏移量。具体用法如下:1. 获取元素的offsetLeft属性值:var offsetLeftValue = element.offs
2023-08-17

Android clipChildren属性实例详解

前言 前几天有在微博上推荐过一个博客,看他文章时发现了这个属性。有些属性不常用,但需要的时候非常有用,于是做了个例子,正好项目用到,与大家分享一下。 正文 一、效果图 看到这个图时你可以先想想如果是你,你怎么实现这个效果。马上想到用
2022-06-06

android开发教程之自定义属性用法详解

最近项目中经常需要用到自定义控件,因此自定义属性也是经常要用到的,在此说明一下自定义属性的用法: 自定义属性都存在于/value/attr.xml文件中,以如下格式存在。 代码如下:
2022-06-06

图文详解Android属性动画

Android中的动画分为视图动画(View Animation)、属性动画(Property Animation)以及Drawable动画。从Android 3.0(API Level 11)开始,Android开始支持属性动画,本文主
2022-06-06

android布局属性详解分享

RelativeLayout 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:lay
2022-06-06

Android帧动画、补间动画、属性动画用法详解

在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢? 帧动画:不是针对View做出一些形状上的变化,而是用于播放一张张的图片,例如一些开机动画,类似于电影播放,使用的是AnimationDrawable来播放帧动画 res
2022-06-06

详解Android中visibility属性VISIBLE、INVISIBLE、GONE的区别

在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gone”。主要用来设置控制控件的显示和隐藏。有些人可能会疑惑Invisible和gone是有什么区别的?
2022-06-06

android ListView 一些重要属性详解

首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false android:stackFromBottom="true" 第二是transciptMode属性,需要用ListView
2022-06-06

详解Android自定义控件属性

在Android开发中,往往要用到自定义的控件来实现我们的需求或效果。在使用自定义 控件时,难免要用到自定义属性,那怎么使用自定义属性呢? 在文件res/values/下新建attrs.xml属性文件,中定义我们所需要的属性。
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录