精华内容
下载资源
问答
  • android launcher应用开发
    万次阅读
    更多相关内容
  • 本书以Launcher为解析核心,全面深入地介绍了Launcher的清单、应用程序组件、资源配置、UI组件以及Launcher的操作等,包含了整个桌面的体系和技巧。本书语言通俗易懂,解析全面,有利于读者理解整个Launcher桌面的...
  • Androidlauncher开发.pdf

    2021-09-30 16:05:02
    Androidlauncher开发.pdf
  • Android Launcher 应用开发

    万次阅读 2017-07-28 18:32:20
    Android Launcher ,也就是Android 的桌面应用程序。 Android Launcher 的功能主要包括有:显示并启动已安装的应用程序、显示桌面(动态)壁纸、显示系统小部件widget 等。 接下来就开始按照一个一个功能实现一个...

    1.简介

    Android Launcher ,也就是Android 的桌面应用程序。

    Android Launcher 的功能主要包括有:显示并启动已安装的应用程序、显示桌面(动态)壁纸、显示系统小部件widget 等。

    接下来就开始按照一个一个功能实现一个简单的Launcher 应用程序。


    2.创建Launcher 应用

    创建Android应用程序,修改Manifest 清单文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.andy.home"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="25" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <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" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    添加的内容:

    <category android:name="android.intent.category.HOME" />                 
    <category android:name="android.intent.category.DEFAULT" />

    此时系统可以识别该应用程序为桌面应用程序。

    运行程序时并没有特别,但是按下Home 键时会有提示如下:

    0001

    3.列出已安装的应用程序

    3.1修改 activity_main.xml 

    添加一个GridView 用来显示应用程序列表,activity_main.xml 如下:

    <LinearLayout  
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <GridView 
            android:id="@+id/apps_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:numColumns="4" />
    
    </LinearLayout >
    

    3.2 通过PackageManager的api 查询已经安装的apk


    	private List<ResolveInfo> mApps;
    	private GridView mGrid;

    private void loadApps() {
            Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
     
            mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
        }

    3.3  实现用于显示Gridview的Adapter,使其显示获得的应用程序列表

    public class AppsAdapter extends BaseAdapter {
            public AppsAdapter() {
            }
     
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView i;
     
     
                if (convertView == null) {
                    i = new ImageView(MainActivity.this);
                    i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                    i.setLayoutParams(new GridView.LayoutParams(50, 50));
                } else {
                    i = (ImageView) convertView;
                }
     
                ResolveInfo info = mApps.get(position);
                i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
     
                return i;
            }
     
            public final int getCount() {
                return mApps.size();
            }
     
            public final Object getItem(int position) {
                return mApps.get(position);
            }
     
            public final long getItemId(int position) {
                return position;
            }
    	}

    3.4 监听GridView的onItemClick事件

    设置一个监听器,当GridView 的某一个项被点击时,回调函数通知我们处理事件。

    @Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		
    		loadApps();
            setContentView(R.layout.activity_main);
            mGrid = (GridView) findViewById(R.id.apps_list);
            mGrid.setAdapter(new AppsAdapter());
    
            mGrid.setOnItemClickListener(listener);
    	}
    	
    	private OnItemClickListener listener = new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                //事件处理
            }
    
        };


    3.5 处理点击事件,启动该图标应用的主Activity

    private OnItemClickListener listener = new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                ResolveInfo info = mApps.get(position);
                
                //该应用的包名
                String pkg = info.activityInfo.packageName;
                //应用的主activity类
                String cls = info.activityInfo.name;
                
                ComponentName componet = new ComponentName(pkg, cls);
                
                Intent i = new Intent();
                i.setComponent(componet);
                startActivity(i);
            }
    
        };

    整个MainActivity 的代码如下:

    package com.andy.home;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.pm.ResolveInfo;
    import android.os.Bundle;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    	private List<ResolveInfo> mApps;
    	private GridView mGrid;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		
    		loadApps();
            setContentView(R.layout.activity_main);
            mGrid = (GridView) findViewById(R.id.apps_list);
            mGrid.setAdapter(new AppsAdapter());
    
            mGrid.setOnItemClickListener(listener);
    	}
    	
    	private OnItemClickListener listener = new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                ResolveInfo info = mApps.get(position);
                
                //该应用的包名
                String pkg = info.activityInfo.packageName;
                //应用的主activity类
                String cls = info.activityInfo.name;
                
                ComponentName componet = new ComponentName(pkg, cls);
                
                Intent i = new Intent();
                i.setComponent(componet);
                startActivity(i);
            }
    
        };
    	
    	
    	private void loadApps() {
            Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
     
            mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
        }
    	
    	
    	
    	public class AppsAdapter extends BaseAdapter {
            public AppsAdapter() {
            }
     
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView i;
     
     
                if (convertView == null) {
                    i = new ImageView(MainActivity.this);
                    i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                    i.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
                } else {
                    i = (ImageView) convertView;
                }
     
                ResolveInfo info = mApps.get(position);
                i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
     
                return i;
            }
     
            public final int getCount() {
                return mApps.size();
            }
     
            public final Object getItem(int position) {
                return mApps.get(position);
            }
     
            public final long getItemId(int position) {
                return position;
            }
    	}
    
    }
    
    运行效果如下图:

    0002

    点击图标即可运行对应的应用程序。



    显示widget 和桌面壁纸将在下一篇介绍。。。










    展开全文
  • 本文实例讲述了Android7.0开发实现Launcher3去掉应用抽屉的方法。分享给大家供大家参考,具体如下: 年初做过一个项目,有一个需求就是需要将桌面变为单层不需要二级菜单。最近几次有小伙伴有这个问我这个解决办法。...
  • Android启动器(Launcher开发详解

    千次阅读 2021-06-05 11:55:55
    第1章 Launcher的诞生1.1 Framework启动Launcher流程1.2 Launcher自身启动流程App-Launcher-数据加载和UI绑定目录 [隐藏]1 1.Launcher桌面数据和主菜单数据加载流程1.1 1.1 加载主菜单数据1.1.1 1.加载调用流程1.2 ...

    第1章  Launcher的诞生

    1.1 Framework启动Launcher流程

    129717_0.png

    1.2 Launcher自身启动流程

    App-Launcher-数据加载和UI绑定

    目录 [隐藏]

    1 1.Launcher桌面数据和主菜单数据加载流程

    1.1 1.1 加载主菜单数据

    1.1.1 1.加载调用流程

    1.2 1.2 加载桌面数据

    1.3 1.3 插入SIM卡时候的数据加载的问题

    1.4 1.4 经典Bug

    1.4.1 166085

    [编辑]1.Launcher桌面数据和主菜单数据加载流程[编辑]1.1 加载主菜单数据PackageManager中加载应用程序数据结构,AppwidgetsManager中加载小部件数据结构,从Favorites数据库中加载桌面数据结构

    129717_1.jpeg

    [编辑]1.加载调用流程LoaderTask一个任务是加载桌面,一个任务是加载抽屉,同步(一个接一个)进行。LauncherModel:waitForIdle()方法用于等待桌面加载完成再加载抽屉。

    等待从favorite表中loadAndBindWorkspace的完成,即完成 桌面的数据 从数据库到内存对象的加载,并且已经显示到了桌面Workspace,

    然后开始loadAndBindAllApps加载主菜单的数据(PackageManager) ,在launcher-loader 子线程获取数据后通过mHandler.postIdle() mHandler.post()将任务post到主线程任务队列DefferedHandler:mQueue中更新UI。

    /** Runs the specified runnable immediately if called from the main thread, otherwise it is

    * posted on the main thread handler. */

    private void runOnMainThread(Runnable r) {

    if (sWorkerThread.getThreadId() == Process.myTid()) {

    // If we are on the worker thread, post onto the main handler

    mHandler.post(r);

    } else {

    r.run();

    }

    }

    /** Runs the specified runnable immediately if called from the worker thread, otherwise it is

    * posted on the worker thread handler. */

    private static void runOnWorkerThread(Runnable r) {

    if (sWorkerThread.getThreadId() == Process.myTid()) {

    r.run();

    } else {

    // If we are not on the worker thread, then post to the worker handler

    sWorker.post(r);

    }

    }

    当用户点击主菜单按钮的时候,将loadAllAppsByBatch获得的数据与PagedViewIcon绑定。 AppsCustomizePagedView:syncAppsPageItems将ApplicationInfo数组构建每一个 PagedViewIcon并添加到PagedViewCellLayout。

    for (int i = startIndex; i < endIndex; ++i) {

    ApplicationInfo info = mApps.get(i);

    PagedViewIcon icon = (PagedViewIcon) mLayoutInflater.inflate(

    R.layout.apps_customize_application, layout, false);

    icon.applyFromApplicationInfo(info, true, this);

    pagedViewCellLayout.addViewToCellLayout(icon, -1, i, new PagedViewCellLayout.LayoutParams(x,y, 1,1));

    items.add(info);

    images.add(info.iconBitmap);

    }

    LoaderTask:run()--->LoaderTask:loadAndBindAllApps()--->LoaderTask:loadAllAppsByBatch()--->

    Launcher:bindAllApplications()--->AppsCustomizePagedView:setApps()--->AppsCustomizePagedView:invalidateOnDataChange()

    129717_2.jpeg

    在点击“主菜单”按钮之前, AppsCustomizePagedView没有任何 Child.点击之后执行时序如下: AppsCustomizeTabHost.onMeasure(...)--->AppsCustomizePagedView.onMeasure(...)--->AppsCustomizePagedView.onDataReady(...)--->(AppsCustomizePagedView)PagedView.invalidatePageData--->AppsCustomizePagedView:syncPages()

    [编辑]1.2 加载桌面数据LauncherModel:startLoader--->LoaderTask:bindWorkspace--->LoaderTask:bindWorkspaceItems--->Launcher:bindItems

    129717_3.jpeg

    [编辑]1.3 插入SIM卡时候的数据加载的问题1.Launcher因为低内存会导致Launcher Activtiy 执行onDestory() onCreate(),会再次执行

    startLoader-->loadAndBindWorkSpace---->loadAndBindAllApps

    2.Launcher 注册了act=android.intent.action.CONFIGURATION_CHANGED Reload apps on config change. curr_mcc:460 prevmcc:0 当识别SIM 的时候也会执行

    startLoader-->loadAndBindWorkSpace---->loadAndBindAllApps

    但是这两种情况导致startLoader调用的时候mAllAppsLoaded==false,mWorkspaceLoaded==false 所以其实是在执行如下,不会重新加载数据结构ArrayList

    startLoader-->BindWorkSpace---->onlyBindAllApps

    --------------------------------------------------------------------------------

    private void loadAndBindAllApps() {

    if (DEBUG_LOADERS) {

    Log.d(TAG, "loadAndBindAllApps mAllAppsLoaded=" + mAllAppsLoaded);

    }

    if (!mAllAppsLoaded) {

    loadAllAppsFromPersistence();

    loadAllAppsByBatch();

    synchronized (LoaderTask.this) {

    if (mStopped) {

    return;

    }

    mAllAppsLoaded = true;

    }

    } else {

    onlyBindAllApps();

    }

    }

    --------------------------------------------------------------------------------

    [编辑]1.4 经典Bug[编辑]166085Launcher:onCreate()---new Thread--->startLoader--->读favoriteDB--->post(bindItem)

    |

    Launcher:onReume()----new Thread--->getMissedCallCount--->post(updateCallLogIcon)------>workspace:updateShortCut()

    当来电 启动 InCallScreen 的时候 会执行Launher:onDestory,挂了电话会执行Launcher:onCreate 由于startLoader消耗的时间 要比getMissedCallCount 长,导致post(updateCallLogIcon)先被执行, 可是这个时候桌面的图标没有被bind,导致没有将未接来电的图标进行更新。

    第2章 Launcher布局与视图

    2.1 hierarchyviewer研究launcher.xml布局

    在Android的SDK工具包中,有很多十分有用的工具,可以帮助程序员开发和测试Android应用程序,大大提高其工作效率。其中的一款叫Hierachy Viewer的可视化调试工具,可以很方便地在开发者设计,调试和调整界面时,提高用户的开发效率。

    第3章  Launcher View拖拽详解

    第4章  Launcher AppWiget架构

    第5章  桌面缩略图实现

    展开全文
  • 在之前我们分析了Android6.0系统在启动时安装应用程序的过程,这些应用程序安装好之后,Launcher应用就负责把它们在桌面上展示出来。 一、AMS启动Launcher  Launcher应用是在AMS的systemReady方法中直接调用...
  • 主要介绍了Android开发实现Launcher3应用列表修改透明背景的方法,结合实例形式分析了Launcher3相关配置文件与功能函数修改设置操作技巧,需要的朋友可以参考下
  • android手把手教你开发launcher.pdf
  • android Launcher3 设置默认桌面应用,供大家参考,具体内容如下 launcher3 的默认桌面应用是在 res/xml里 默认有4种样式 default_workspace_3x3.xml default_workspace_4x4.xml default_workspace_5x5.xml ...
  • Android Launcher应用开发.pdf

    在这里插入图片描述
    Android Launcher应用开发.pdf
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 里面包含了"Android_Launcher应用开发.pdf"和本书提供的"示例代码",需要有一定的Android基础,适合Android进阶
  • 本文实例讲述了Android开发Launcher3常见默认配置修改方法。分享给大家供大家参考,具体如下: Launcher概述 Launcher是开机完成后第一个启动的应用,用来展示应用列表和快捷方式、小部件等。Launcher作为第一个...
  • 使用Flutter Ubuntu Launcher构建的Android启动器这是一个自定义的轻量级Android启动器。 以下是一些屏幕截图:主屏幕:选项:从左向右滑动以显示选项:单击“拨号”选项将您带到系统拨号盘:单击“ Ubuntu”图标...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Android 应用开发源码 参考与学习使用
  • Android 系统桌面 App —— Launcher 开发

    千次阅读 热门讨论 2019-06-18 11:36:42
    Launcher就是Android系统的桌面,它也是一个app,用于管理其他的app。
  • 1、增加全局控制变量 sys.launcher3.is_full_app,用来动态切换 2、增加两套布局,对应有抽屉和无抽屉 3、去除 allAppsButton 4、将 AllAppsContainerView 中的图标加载到 Workspace 5、新安装的 app 自动添加图标到...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...
  • Stage2_Lesson3Android应用开发基础及原理概要 Stage2_Lesson4Activity与Intent Stage2_Lesson5Service初步 Stage2_Lesson10应用程序签名及发布 Stage2_Lesson8ContentProvider Stage2_Lesson9BroadcastReceiver ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,273
精华内容 13,309
热门标签
关键字:

android launcher应用开发