定制android桌面_android 桌面定制 - CSDN
精华内容
参与话题
  • 最近接了一个开发车载导航上的android launcher的工作,Launcher源码比较多,而且里面应用了很多设计模式,要把它分析清楚要花不少精力,网上也有一些零碎的分析文章,不过关于修改的文章不多,就想到要把开发和修改...

            最近接了一个开发车载导航上的android launcher的工作,Launcher源码比较多,而且里面应用了很多设计模式,要把它分析清楚要花不少精力,网上也有一些零碎的分析文章,不过关于修改的文章不多,就想到要把开发和修改的过程通过博客的方式记录下来,边开发边记录,等开发完之后,再回顾肯定有很大的成就感,好了,废话不多说,切入正题。

    我现在手头上的launcher的源码是基于android4.1的,其实4.0,4.1,4.2,乃至4.4的差距并不是很大,但是由于运行系统是4.1的,所以,最好还是基于4.1的版本来开发,由于原生的launcher(以后简称桌面好了,比Launcher打的快一点),今天的主要工作就是去掉原生桌面的某些东西(搜索栏目,竖条等),修改hotseat的排列方式。先来看看我的效果图吧(开发样机使用的是魅族MX,嘻嘻*-*):

        因为程序是用于车载导航仪的,所以界面和一般的手机界面差别较大。改动也比较大,不过对于Launcher的分析修改都是通用的,大家也将就着看下去吧。这里也放一下原生桌面的样子:

    接下来,我们就针对界面修改的地方做分析:

    一、竖屏改横屏

    这里其实没什么技术含量,就是修改manifest,找到android:screenOrientation这个属性,将其值修改为landscape即可

    二、去除google search bar

    因为是定制的车载导航需要的launcher,所以这个一直显示在顶栏的google search bar就显得比较讨厌了,肯定是要去掉的,那么,要怎么去掉呢,研究清楚了其实也不复杂:

    1. Launcher2\res\layout\qsb_bar.xml中,

    1     <include android:id="@+id/qsb_search_bar"
    2         layout="@layout/search_bar"
    3          android:visibility="gone"  />

    加入 android:visibility="gone"

    2.  packages\apps\Launcher2\res\layout-port\launcher.xml

    1 <com.android.launcher2.DrawableStateProxyView 
    2             android:id="@+id/voice_button_proxy" 
    3             android:layout_width="80dp" 
    4             android:layout_height="@dimen/qsb_bar_height" 
    5             android:layout_gravity="top|right" 
    6             android:clickable="false"    //modify this value to false 
    7             onClick="onClickVoiceButton" 
    8             android:importantForAccessibility="no" 
    9             launcher:sourceViewId="@+id/voice_button" />
    android:clickable属性修改为"false"

    3.  Launcher2\src\com\android\launcher2\SearchDropTargetBar.java 中 onFinishInflate() 方法内,将mQSBSearchBarAnim 相关的部分作如下修改

     1     // Create the various fade animations
     2         if (mEnableDropDownDropTargets) {
     3             mDropTargetBar.setTranslationY(-mBarHeight);
     4             mDropTargetBarAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY",
     5                     -mBarHeight, 0f);
     6             mQSBSearchBarAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY",  -mBarHeight ,
     7                     -mBarHeight); //modify 3rd para to -mBarHeight
     8         } else {
     9             mDropTargetBar.setAlpha(0f);
    10             mDropTargetBarAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f, 1f);
    11             mQSBSearchBarAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha",  0f , 0f); //modify 3rd para to 0f;
    12         }

    4.  仍然是这只 java 文件,将showSearchBar 方法作如下修改:

     1 public void showSearchBar(boolean animated) {
     2 
     3         if (!mIsSearchBarHidden) return;
     4         if (animated) {
     5             prepareStartAnimation(mQSBSearchBar);
     6             mQSBSearchBarAnim.reverse();
     7         } else {
     8             mQSBSearchBarAnim.cancel();
     9             if (mEnableDropDownDropTargets) {
    10                 mQSBSearchBar.setTranslationY(0);
    11             } else {
    12                 mQSBSearchBar.setAlpha( 0f ); //参数改为 0f;
    13             }
    14         }
    15         mIsSearchBarHidden = false;
    16     }

    三、hotseat的修改

    改完之后,我们会发现hotseat排列到右边去了,显的很不美观是不是?作为车载导航的launcher,我们肯定是希望hotseat能排布在屏幕的Bottom啊,没关系,我们来改一下:

    首先,我们需要修改Hotseat.java

     1 public Hotseat(Context context, AttributeSet attrs, int defStyle) {
     2   super(context, attrs, defStyle);
     3 
     4   TypedArray a = context.obtainStyledAttributes(attrs,
     5   R.styleable.Hotseat, defStyle, 0);
     6   mCellCountX = a.getInt(R.styleable.Hotseat_cellCountX, -1);
     7   mCellCountY = a.getInt(R.styleable.Hotseat_cellCountY, -1);
     8   mAllAppsButtonRank = context.getResources().getInteger(R.integer.hotseat_all_apps_index);
     9   mIsLandscape = false;//context.getResources().getConfiguration().orientation ==
    10   //Configuration.ORIENTATION_LANDSCAPE;
    11 }

        注意这里有一个大屏幕还是小屏幕的判断,这个是用来判断属于平板系统还是一般的手机系统。因为我系统是只会在横屏时使用,所以我直接设置成mIsLandscape为小屏幕,因为Hotseat里面很多获取熟悉都是区分大小屏幕。小屏幕的时候,我们使用竖向配置hotseat就可以得到相当于手机系统的hotseat效果,hotseat会显示在屏幕底下。

        下面我们看看Hotseat的配置文件,Hotseat是属于workspace的,所以需要在workspace配置文件里面配置,打开launcher.xml就可以看到hotseat的配置,这个并不是所有launcher.xml文件都有hotseat属性,如果你的launcher要适配多个分辨率的机器,那么你就得在适合你机器的分辨率下的相应的目录下的launcher.xml下添加hotseat属性。这里需要将android:layout_height和android:layout_width的属性对调一下,然后将android:layout_gravity改为bottom

    1 <include layout="@layout/hotseat"
    2 android:id="@+id/hotseat"
    3 android:layout_height="@dimen/button_bar_height_plus_padding"
    4 android:layout_width="match_parent"
    5 android:layout_gravity="bottom" />

    改完这个还是不够的,运行的时候,你会发现hotseat图标都缩到一起去了,还有一个地方也需要修改,layout-land/hotseat.xml也是需要做一下配置改 动的

     1 <com.launcherjellybean.android.Hotseat
     2 xmlns:android="http://schemas.android.com/apk/res/android"
     3 xmlns:launcher="http://schemas.android.com/apk/res/com.launcherjellybean.android"
     4 launcher:cellCountX="@integer/hotseat_cell_count"
     5 launcher:cellCountY="1">
     6 <com.launcherjellybean.android.CellLayout
     7 android:id="@+id/layout"
     8 android:layout_width="wrap_content"
     9 android:layout_height="match_parent"
    10 android:layout_gravity="center"
    11 android:paddingTop="@dimen/button_bar_height_top_padding"
    12 android:paddingBottom="@dimen/button_bar_height_bottom_padding"
    13 android:paddingLeft="@dimen/button_bar_width_left_padding"
    14 android:paddingRight="@dimen/button_bar_width_right_padding"
    15 
    16 launcher:cellWidth="@dimen/hotseat_cell_width"
    17 launcher:cellHeight="@dimen/hotseat_cell_height"
    18 launcher:widthGap="@dimen/hotseat_width_gap"
    19 launcher:heightGap="@dimen/hotseat_height_gap"
    20 launcher:maxGap="@dimen/workspace_max_gap" />
    21 </com.launcherjellybean.android.Hotseat>

    其中 launcher:cellCountX 的值和 launcher:cellCountY 是需要对调的,你想想就知道为什么了

    另外 android:layout_height 也需要从wrap_content变成match_parent,去查查他们的区别,你就知道为什么这么改了

    光是这么改,也依然不够,原生桌面图标是4* 4的布局,如果把hotseat挪下来,就变成了5 *4的图标了,显然,太拥挤了,那么就需要修改桌面的行列数, 打开文件values/config.xml,修改以下2个字段

    <integer name="cell_count_x">4</integer>
    <integer name="cell_count_y">3</integer>

    这里我将cell_count_y从4改成了3,从而让hotseat占据了第四行,运行发现除了hotseat那一行的图标,其余图标都排布的比较下面,这是什么原因呢,这是因为桌面图标的高度是自适应居中的,由于我们修改了配置为3行,那么桌面图标自然在上下都留出了相应的高度,以便让图标居中了,所以,我们要让桌面图标知道,最后一行是被hotseat给占据了,从而还需要修改launcher.xml这个文件

     1 <com.launcherjellybean.android.Workspace
     2 android:id="@+id/workspace"
     3 android:layout_width="match_parent"
     4 android:layout_height="match_parent"
     5 android:paddingLeft="@dimen/workspace_left_padding"
     6 android:paddingRight="@dimen/workspace_right_padding"
     7 android:paddingTop="0dp"
     8 android:paddingBottom="60dp"
     9 launcher:defaultScreen="1"
    10 launcher:cellCountX="@integer/cell_count_x"
    11 launcher:cellCountY="@integer/cell_count_y"
    12 launcher:pageSpacing="@dimen/workspace_page_spacing"
    13 launcher:scrollIndicatorPaddingLeft="@dimen/qsb_bar_height"
    14 launcher:scrollIndicatorPaddingRight="@dimen/button_bar_height">

    这里,我修改了android:paddingBottom 和 android:paddingTop这2个值,以让图标看起来不会那么奇怪,这样,已经成功了一大半了

    四、去掉多余的2根竖线

    我们修改完以上的东西,会发现还多了2根竖线,一根是google search bar留下的,另外一根是hotseat剩下的,放在2边很不美观,对吧,绝壁要去掉啊!!!  那么,这2根讨厌的竖线在哪呢,它们就藏在launcher.java里:

    1 private View mQsbDivider;
    2 private View mDockDivider;

    我们找到和这2个变量有关的代码,全部予以屏蔽即可,比如hideDockDivider() 、showDockDivider()这些之类的,要坚决予以屏蔽,另外在WorkSpace.java里也发现了它们的身影:

     1 void setFadeForOverScroll(float fade) {
     2 if (!isScrollingIndicatorEnabled()) return;
     3 
     4 mOverscrollFade = fade;
     5 float reducedFade = 0.5f + 0.5f * (1 - fade);
     6 final ViewGroup parent = (ViewGroup) getParent();
     7 // final ImageView qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));
     8 // final ImageView dockDivider = (ImageView) (parent.findViewById(R.id.dock_divider));
     9 final View scrollIndicator = getScrollingIndicator();
    10 
    11 cancelScrollingIndicatorAnimations();
    12 //if (qsbDivider != null) qsbDivider.setAlpha(reducedFade);
    13 //if (dockDivider != null) dockDivider.setAlpha(reducedFade);
    14 scrollIndicator.setAlpha(1 - fade);
    15 }

    也跟我一起屏蔽它们就可以了,这样烦人的竖线就不会出现了,你也会做到和我在一开始展示的那样的效果。

    展开全文
  • Android 定制自己的launcher

    万次阅读 2017-02-07 14:29:16
    launcher(安卓系统桌面启动器) launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launcher出错的...

          launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launcher出错的时候,安卓系统会出现“进程 com.android.launcher 意外停止”的提示窗口。这时需要重新启动Launcher。

          对于大部分Android开发来说不用改变Android的launcher,不过有的需要做定制的Android系统,比如有的商家做的是放在汽车上的平板,这种情况下,用原生态的Android系统,图标众多和图标小,给用户的使用带来了不好的体验,这种情况下,只需要自己做一个launcher来代替Android原生态的launcher就可以了,在自己的launcher里面,你想放哪些图标就放哪些图标,想放多大就放多大。

          把自己的apk改成launcher的方法:

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.MONKEY" />
    </intent-filter>

          然后运行程序,重启之后,就会出现一个选择launcher的页面,

          这个时候表示系统筛选的时候能够识别自己做的launcher。比如点击“测试用”app,打开之后,按home键就不会再出现Android自带的桌面了,只会出现“测试用”app的首页。不过在首页按返回键会返回到选择launcher这个页面,去重写onBackPressed()也没有用,暂时不知,后面再看

    @Override
        public void onBackPressed() {
    //        super.onBackPressed();
        }

    至于怎么让系统不弹出选择而是默认,后面再看。

    (后面遇到了自己写的luncher打败了系统的luncher的情况,一开机自动选择自己的luncher,只有在自己luncher损坏的情况下才会出现系统的luncher,这个效果的做法,是把自己写的luncher的包名写入系统里面,具体怎么操作,我就不清楚了)


    题外话:

    <intent-filter>
        	<action android:name="android.intent.action.MAIN" />
        	<category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>

         如果你的应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是你无法在启动器中看到或者打开这个程序。这种程序一般都是作为第三方服务供其他的应用在内部进行调用的,如支付宝快捷支付服务。


    展开全文
  • Android定制Home,以及launcher的自定义

    千次阅读 2018-03-06 08:57:03
    替换Android桌面的相关问题:1、想将home screen换成自己写的activity,该如何实现?在你要设置为home screen的那个activity的androidManifest.xml中的&lt;intent-filter&gt;标签中加上这几句 话&lt;...

    替换Android桌面的相关问题:

    1、想将home screen换成自己写的activity,该如何实现?

    在你要设置为home screen的那个activity的androidManifest.xml中的<intent-filter>标签中加上这几句 话<category android:name="android.intent.category.HOME" />
    <category android:name="android.intent.category.DEFAULT" />运行后,重启模拟器会弹出一个选择进入哪个界面的对话框

    2、怎样将系统默认的home screen删除?

    重新编译launcher源码,去掉配置文件中的home属性和HOME属性。。
    在自己的activity中加入这两个属性,然后重新烧系统。 

    以下是定制Android的完整思路和步骤:

    如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher.
    我们可以通过修改Framework来实现这样的功能。

    这里以Android2.1的源代码为例来实际说明。

    1)首先了解一下Android的启动过程。
    Android系统的启动先从Zygote开始启动,然后……(中间的过程就不说了)…..一直到了SystemServer(framework)这个地方,看到这段代码:

    1. /**
    2. * This method is called from Zygote to initialize the system. This will cause the native
    3. * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back
    4. * up into init2() to start the Android services.
    5. */
    6. native public static void init1(String[] args);

    7. public static void main(String[] args) {
    8. if (SamplingProfilerIntegration.isEnabled()) {
    9. SamplingProfilerIntegration.start();
    10. timer = new Timer();
    11. timer.schedule(new TimerTask() {
    12. @Override
    13. public void run() {
    14. SamplingProfilerIntegration.writeSnapshot(“system_server”);
    15. }
    16. }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
    17. }

    18. // The system server has to run all of the time, so it needs to be
    19. // as efficient as possible with its memory usage.
    20. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

    21. System.loadLibrary(“android_servers”);
    22. init1(args);
    23. }

    24. public static final void init2() {
    25. Log.i(TAG, “Entered the Android system server!”);
    26. Thread thr = new ServerThread();
    27. thr.setName(“android.server.ServerThread”);
    28. thr.start();
    29. }
    30. }

    从SystemServer的main函数开始启动各种服务。
    首先启动init1,然后启动init2.
    从上面的注释可以看到:init1这个方法时被Zygote调用来初始化系统的,init1会启动native的服务如SurfaceFlinger,AudioFlinger等等,这些工作做完以后会回调init2来启动Android的service。

    这里我们主要来关注init2的过程。
    init2中启动ServerThread线程,
    ServerThread中启动了一系列的服务,比如这些:

    1. ActivityManagerService
    2. EntropyService
    3. PowerManagerService
    4. TelephonyRegistry
    5. PackageManagerService
    6. AccountManagerService
    7. BatteryService
    8. HardwareService
    9. Watchdog
    10. SensorService
    11. BluetoothService
    12. StatusBarService
    13. ClipboardService
    14. InputMethodManagerService
    15. NetStatService
    16. ConnectivityService
    17. AccessibilityManagerService
    18. NotificationManagerService
    19. MountService
    20. DeviceStorageMonitorService
    21. LocationManagerService
    22. SearchManagerService
    23. FallbackCheckinService
    24. WallpaperManagerService
    25. AudioService
    26. BackupManagerService
    27. AppWidgetService

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

    在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<categoryAndroid:name=”android.intent.category.HOME” />)来过滤。
    然后根据filter出来的HOME来启动,如果只有一个HOME,则启动这个HOME,如果用户自己装了HOME,那就会弹出来一个列表供用户选择。

    我们现在希望从这里弹出我们自己定制的Launcher,同时也不希望弹出选择HOME的界面,我们不希望用户修改我们的home,比如我们的home上放了好多广告,以及强制安装的程序,不希望用户把它干掉。

    我们可以通过这样来实现:

    2) 定义一个私有的filter选项,然后用这个选项来过滤HOME.
    一般情况下我们使用Manifest中定义的<category android:name=”android.intent.category.HOME”来过滤的,我们现在增加一个私有的HOME_FIRST过滤。

    在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加两行代码

    1. //添加CATEGORY_HOME_FIRST
    2. @SdkConstant(SdkConstantType.INTENT_CATEGORY)
    3. public static final String CATEGORY_HOME_FIRST = “android.intent.category.HOME_FIRST”;

    3)修改和CATEGORY_HOME相关的所有的地方,都改成HOME_FIRST,主要是framework中的这几个地方:

    1. frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中
    2. //intent.addCategory(Intent.CATEGORY_HOME);
    3. 改成intent.addCategory(Intent.CATEGORY_HOME_FIRST);
    4. //if (r.intent.hasCategory(Intent.CATEGORY_HOME)) {
    5. 改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST

    6. frameworks/base/services/java/com/android/server/am/HistoryRecorder.java中
    7. // _intent.hasCategory(Intent.CATEGORY_HOME) &&
    8. 改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST

    9. frameworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中
    10. //mHomeIntent.addCategory(Intent.CATEGORY_HOME);
    11. 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST);

    12. frameworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中
    13. //new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
    14. 改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0);

    15. frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中
    16. //mHomeIntent.addCategory(Intent.CATEGORY_HOME);
    17. 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST);

    18. frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中
    19. //ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
    20. 改成 ResolveInfo homeInfo = pm.resolveActivity(newIntent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0);

    4) 写一个自己的Launcher.
    可以参考Android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。
    在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name=”android.intent.category.HOME”
    现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为:

    1. <application android:process=”android.process.acore3″ android:icon=”@drawable/icon” android:label=”@string/app_name”>
    2. <activity android:name=”.FirstAppActivity”
    3. android:label=”@string/app_name”>
    4. <intent-filter>
    5. <action android:name=”android.intent.action.MAIN” />
    6. <category android:name=”android.intent.category.HOME_FIRST” />
    7. <category android:name=”android.intent.category.DEFAULT” />
    8. <category android:name=”android.intent.category.MONKEY” />
    9. </intent-filter>
    10. </activity>
    11. </application>

     

    然后将编译好的apk放到/out/target/product/generic/system/app目录下。

    5)将Android自带的Launcher删除掉,包括源代码(packages/apps/Launcher)和apk(/out/target/product/generic/system/app/Launcher.apk)。

    6)
    做完这些工作,就可以重新编译Android了,我们可以编译修改过的几个相关的包。
    如果之前编译过了Android源码,可以用mmm命令来编译部分的改动。
    这里需要这样编译:

    1. $ . build/envsetup.sh
    2. $ mmm frameworks/base
    3. $ mmm frameworks/base/services/java
    4. $ mmm frameworks/policies/base/mid
    5. $ mmm frameworks/policies/base/phone

    7)
    编译完成后重新生成img文件。

    1. $ make snod

    现在可以启动Android模拟器来看效果了。
    首先设置环境变量:
    $ export ANDROID_PRODUCT_OUT= ./out/target/product/generic
    然后切换到
    $ cd ./out/host/linux-x86/bin
    运行
    $ ./emulator

    这样我们启动的模拟器里面用的image就是我们刚才编译好的自己定制的东西了。
    从模拟器上可以看到启动的Launcher是我们自己的Launcher,不会出现默认的Launcher了,也不会出现选择界面。

    9)我们再验证一下,如果用户装上了一个其他的Launcher(Home)会怎么样。
    从网上找一个一般的Launcher或者自己写一个一般的Launcher装上去,重新启动,不会出现选择界面。
    按HOME键也不会出来两个HOME来选择。

    这样我们就牢牢控制了用户的桌面。
    只有我们自己定制的HOME才能装上。 这对于定制Android设备的厂商很有用处。

    展开全文
  • 如何利用Android源码定制你想要的系统桌面?比如: 这样的桌面很简洁,看起来很舒适,那如何在做才能够达到这样的效果呢?下面讲述我的定制方式。要能够达到这样的效果,做了如下改动1. 将所有应用直接放在桌面上...
    如何利用Android源码定制你想要的系统桌面?比如:
     
    这样的桌面很简洁,看起来很舒适,那如何在做才能够达到这样的效果呢?下面讲述我的定制方式。

    要能够达到这样的效果,做了如下改动
    1. 将所有应用直接放在桌面上。
    删除了主菜单,所有应用全部放在桌面上,现在很多消费类手机都是流行这桌面的,并且自带的指定的应用不能够在桌面上被删除。
    在packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java中isDisableAllApps方法中做如下改动:

    1. packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java
    2.      public static boolean isDisableAllApps() {
    3.          // Returns false on non-dogfood builds.
    4. -        return getInstance().mBuildInfo.isDogfoodBuild() &&
    5. -                Utilities.isPropertyEnabled(Launcher.DISABLE_ALL_APPS_PROPERTY);
    6. +        //return getInstance().mBuildInfo.isDogfoodBuild() &&
    7. +        //        Utilities.isPropertyEnabled(Launcher.DISABLE_ALL_APPS_PROPERTY);
    8. +        return true;
    9.      }

    2. 桌面上隐藏某些不需要的应用图标
    有些需求是需要隐藏一些系统自带应用图标,不让用户看到,简化桌面。比如:自带的音乐、FM等等等

    1. packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java
    2.      //mtk add begin
    3.      mBgAllAppsList.removePackage("com.android.email", user, true);
    4.      mBgAllAppsList.removePackage("com.android.browser", user, true);
    5.      mBgAllAppsList.removePackage("com.android.soundrecorder", user, true);
    6.      mBgAllAppsList.removePackage("com.mediatek.fmradio", user, true);
    7.      mBgAllAppsList.removePackage("com.android.quicksearchbox", user, true);
    8.      mBgAllAppsList.removePackage("com.android.documentsui", user, true);
    9.      mBgAllAppsList.removePackage("com.android.music", user, true);
    10.      mBgAllAppsList.removePackage("com.mediatek.datatransfer", user, true);
    11.      mBgAllAppsList.removePackage("com.android.calculator2", user, true);
    12.      mBgAllAppsList.removePackage("com.easier.code", user, true);
    13.      mBgAllAppsList.removePackage("com.android.providers.downloads.ui", user, true);
    14.      mBgAllAppsList.removePackage("com.android.camera.CameraLauncher", user, true);
    15.      mBgAllAppsList.added.removeAll(mBgAllAppsList.removed);
    16.      mBgAllAppsList.removed.clear();
    17.      //mBgAllAppsList.removePackage("PackageName", user, true); PackageName为要隐藏的包名
    复制代码

    3. 对桌面的应用图标重新排布
    对桌面的应用图标,按照自己的需求进行重新排布

    1. packages/apps/Launcher3/res/xml/default_workspace_4x4.xml
    2. Example: //例子
    3.     <favorite
    4.         launcher:packageName="com.android.deskclock"
    5.         launcher:className="com.android.deskclock.DeskClock"
    6.         launcher:screen="1"
    7.         launcher:x="0"
    8.         launcher:y="3" />

    4. 修改桌面默认壁纸
    将自己中意的壁纸或者客户需要的壁纸更改为系统桌面默认的壁纸,按照分辨率,替换掉壁纸。桌面壁纸路径如下 :

    1. frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.jpg
    2. frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.jpg
    3. frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.jpg
    4. frameworks/base/core/res/res/drawable-xhdpi/default_wallpaper.jpg
    5. frameworks/base/core/res/res/drawable-xxhdpi/default_wallpaper.jpg
    6. frameworks/base/core/res/res/drawable-xxxhdpi/default_wallpaper.jpg
    复制代码

    5. 应用默认放在第一屏
    当用户安装应用时,应用的快捷图标,默认放在桌面的第一屏
    1. packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java
    2. -                        int startSearchPageIndex = workspaceScreens.isEmpty() ? 0 : 1;
    3. +                        //int startSearchPageIndex = workspaceScreens.isEmpty() ? 0 : 1;
    4. +                        int startSearchPageIndex = 0;
    复制代码

    6. 根据需求保留应用

    很多需要定制的界面,都是根据需求而做的,比如上述的图片,根据需求,就保留了如下应用图标:
    时钟、日历、文件管理、相机
    电话、电话簿、设置、信息、图库


    总结:
    自己定制一个界面是比较繁琐的事情,需要考虑界面的美观,以及桌面的流畅。不过,跨过繁琐,一个全新的系统桌面展现在你的面前,会很有成就感!
    展开全文
  • 定制android桌面系统

    2017-11-27 17:22:55
    最近项目用到桌面定制,于是研究了AppWidgetProvider,话不多说,直接进入正题. 其实打开AppWidgetProvider源码我们会发现,他是继承于broadcastReceiver的广播接收器,其中会定义一个onUpdate的方法,该方法会在桌面加载...
  • 自己动手写android手机桌面(第一篇)

    千次阅读 2014-05-05 11:42:16
    开发自己的android桌面,有这个想法是去年一个项目(移动公司的变态项目,需要定制android机器,将一对移动业务定制到里面去)需要定制android桌面,当初的做法是直接改原版的Launcher.apk源码,然后再Linux下编译生成...
  • 开发自己的android桌面,有这个想法是去年一个项目(移动公司的变态项目,需要定制android机器,将一对移动业务定制到里面去)需要定制android桌面,当初的做法是直接改原版的Launcher.apk源码,然后再Linux下编译生成...
  • 定制替换Android桌面(home screen) Launcher

    千次阅读 2016-03-08 15:53:37
    替换Android桌面的相关问题: 1、想将home screen换成自己写的activity,该如何实现? 在你要设置为home screen的那个activity的androidManifest.xml中的标签中加上这几句 话 运行后,重启模拟器会弹出一个选择...
  • 定制替换Android桌面(home screen) launcher

    千次阅读 2013-01-06 16:55:18
    定制替换Android桌面(home screen) [日期:2011-08-21] 来源:Linux社区 作者:hb_zha   替换Android桌面的相关问题: 1、想将home screen换成自己写的activity,该如何实现? ...
  • 自定义一个home screen 后如何在这个页面调用,系统桌面上的应用,求大神帮助
  • Android实现定制桌面

    2016-11-25 21:40:41
    实现定制桌面: 在App的主MainActivity里面获取系统所有App并且使用GridView显示出来创建Android项目 5.1系统 项目名为:AndroidCusyomDesktopDemoXML文件: 一.在MainActivity(使用线性布局,纵向)里创建一个GridView...
  • 定制替换Android桌面(home screen) 发表于99 天前 ⁄ 编程开发 ⁄ 评论数 1 替换Android桌面的相关问题: 1、想将home screen换成自己写的activity,该如何实现? 在你要设置为home s
  • Android桌面(Launcher)的定制

    千次阅读 2012-06-23 21:26:29
    如何在Android的启动桌面上预设一些你需要的元素呢?下面为你解答 1. 如何让系统以动态桌面的方式启动? 修改位置在frameworks/base/core/res/res/values目录找到Config.xml文件,找到下面这一行 null  ...
  • Android 应用桌面角标显示

    万次阅读 2017-09-14 11:34:16
    Android 应用桌面角标显示前言 ### 什么是角标?...实际上,Android原生系统并不支持桌面应用角标的显示,各个Android厂商在定制系统的时候,模仿ios系统,实现了这个功能,角标实现主要是厂商定制Launch
  • 我的工作怡康智能服务终端,继续进行中,在帖子宇朔医疗项目进展,展示了为该项目定制桌面效果图。现在, 在2018年到来之前将这个小目标实现了: 为定制这个 桌面,做了如下改动:1. 背景图片显示“怡康智能服务...
  • android 设置默认桌面

    万次阅读 热门讨论 2015-11-19 16:47:54
    最近搞一个将自己应用的Launcher引导用户设置为默认Launcher,本以为是一个小功能应该很快就可以搞定了,但是我真是低估了国内手机厂商定制Android修改的东西了。 难以解决的问题有以下三点: 0、监听home键 1...
  • Android桌面小部件(入门)

    千次阅读 2018-10-17 15:10:13
    桌面小部件的应用还是很多的,比如网易云音乐、微博等,虽然我们开发的APP并不一定需要开发这个,但简单了解学习一下还是可以的。 AppWidgetProvider是Android提供的开发小部件的类,所以我们开发小部件即只需要...
  • Android创建桌面快捷方式

    千次阅读 2018-11-20 17:21:04
      背景 ... 添加桌面图标快捷方式代码非常简单,在API 26(Android O)以下的版本,并没有提供API进行创建桌面快捷方式,但是用户可以通过广播的方式创建桌面快捷方式。在API 26(Android O...
  • Android桌面小图标终极解决方案

    千次阅读 2017-04-09 18:31:31
    `本来安卓创建桌面小图标大家都知道是有系统Api的,也很简单,但是有些定制神机改了后就比较蛋疼了,像OPPO的ColorOS3.0。但是都出自与安卓原理基本都是一样的,一般桌面的东西都会保存在一个叫launcher数据库里面,...
  • AndroidTV桌面BriskTVLanucher

    千次阅读 2016-06-17 19:22:03
    一个开源的急速Android盒子桌面:GitHub:BriskTVLauncher
1 2 3 4 5 ... 20
收藏数 12,446
精华内容 4,978
关键字:

定制android桌面