Android更改桌面应用程序launcher的两种方式

[置顶]Android更改桌面应用程序launcher的两种方式

分类:Android

怎样使我们的应用程序成为一个launcher?

首先我们要有一个自己的Android应用,在这里,我使用最简单的应用程序Hello,

使用eclipse创建Android项目我这里就省略了,直接上图

来看看我的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android=""package="com.example.hello"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="7"android:targetSdkVersion="7" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.example.hello.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest> 我们知道,一个应用程序可以有多个Activity,每个Activity是同级别的。那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程 序列表里,有些不需要。怎么定义呢?android.intent.action.MAIN决定应用程序最先启动的Activity ,android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。Main和LAUNCHER同时设定才有意义,如果有多个同级的Activity都有过滤器<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter> 则只有最前面的Activity的 <action android:name="android.intent.action.MAIN" /> 有 效,启动该程序时,执行的是该Activity。且在程序列表中有多个图标,这些Activity都在程序列表中显示,该Application有多个入 口,执行不同的Activity,但是整个程序的主入口(整个程序最先运行的那个activity)只有最先定义的那个Activity。 如 果一个应用没有LAUNCHER则该apk仍能安装到设备上,但是在主程序图中看不到。如果给那个Activity 设定了LAUNCHER,且同时设定了Main,则这个Activity就可出现在程序图中;如果没有Main,则不知启动哪个Activity,故也不 会有图标出现。

那如果我们要把一个应用程序做为桌面应用程序,该怎么办呢?

如果了解Android的启动流程的同学都知道,Zygote启动SystemServer,SystemServer的main函数开始启动各种服务。 首先启动init1,然后启动init2.init1这个方法是被Zygote调用来初始化系统的,init1会启动native的服务如SurfaceFlinger,AudioFlinger等等,这些工作做完以后会回调init2来启动Android的service。

public static final void init2() {501Log.i(TAG, "Entered the Android system server!");502Thread thr = new ServerThread();503thr.setName("android.server.ServerThread");504thr.start();505}

init2中启动ServerThread线程,ServerThread中启动了一系列的服务,比如ActivityManagerService,EntropyService等等。

当这些服务起来以后,开始 ((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady() 在systemReady后开始开始启动Launcher。

frameworks\base\services\java\com\android\server\am\ActivityManagerService.java

8422public void systemReady(final Runnable goingCallback) {8423// In the simulator, startRunning will never have been called, which8424// normally sets a few crucial variables. Do it here instead. …………………….8594resumeTopActivityLocked(null); }

frameworks\base\services\java\com\android\server\am\ActivityManagerService.java 2576private final boolean resumeTopActivityLocked(HistoryRecord prev) {2577// Find the first activity that is not finishing. 2578HistoryRecord next = topRunningActivityLocked(null); 2579 2580// Remember how we'll process this pause/resume situation, and ensure 2581// that the state is reset however we wind up proceeding. 2582final boolean userLeaving = mUserLeaving; 2583mUserLeaving = false; 2584 2585if (next == null) { 2586// There are no more activities! Let's just start up the 2587// Launcher… 2588return startHomeActivityLocked(); 2589}人之所以有一张嘴,而有两只耳朵,原因是听的要比说的多一倍。

Android更改桌面应用程序launcher的两种方式

相关文章:

你感兴趣的文章:

标签云: