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

Android实现定制桌面的方法

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Android实现定制桌面的方法

本文实例讲述了Android实现定制桌面的方法。分享给大家供大家参考。具体如下:

launcher也就是我们的Home,可以简单地把它理解为一个简化的linux GUI。作为一个GUI它首先必须完成它最本分的功能,就是它必须能提供对所有应用程序(CATEGORY_LAUNCHER)的映射;不过作为一个 GUI,它除了做好本分之外还必须是符合大众审美的美女(wallpaper);另外还必须具有良好的交互性,没有良好的交互性就像你对一位美女殷勤了半天,她却直接对无视,那结果是比较糟糕的~~

所谓兵马未动,粮草先行,在了解launcher的细节之前,我们首先需要完成对一些知识的扫盲。当然这些知识我们都可以在SDK guide大叔那边找到,俺可以很负责任地告诉大家,如果你把SDK guide大叔的三板斧都学会了,APK你基本就处于无敌状态了,绝对护甲+10000,最起码基础知识是够了,其他比的就是创意了:

1、必须比较完整地了解APK的4个部件,尤其是Activity,现在可以简单地理解Activity是一个应用程序的窗口。

2、必须了解UI的那部分内容,这部分内容是比较多的,English一般的我看得是比较抑郁的,但如果你想设计一个符合自己审美要求的美女或者帅哥是必须得得了解的,不需要一下能完全理解,但至少出了问题你知道去哪部分查~~

3、Resources那部分内容可以当百科全书查

4、intent那部分内容也是需要了解比较详细的,他是和应用沟通的渠道,大家可以参考一下小斯大虾写的文档。

5、manifest必须了解,security可以看看

6、Graphic部分的内容是给需要更高品味的GUI设计提供的,虽然它可能主要用在游戏上面,但我觉得如果要作出够酷的GUI肯定是需要2d,3d引擎的。

7、AppWidget可以作为了解,用的时候再翻阅

各位路过的大虾们肯定被这么多的粮草给直接雷倒了,其实需要我们详细掌握的是1和2,其他的都可以当作百科全书,但是如果能仔细地看透了那是最好了。

好,万事俱备只欠东风了,我们首先来看看这个Home是在啥时候由谁来启动的。这部分知识可以跳过,但是理解一下是好的,你可以了解一个APK进程是如何怀胎十月之后诞生的。可能下面说到的词汇有些生涩,所以建议先看看Android Anatomy and Physiology.pdf。

Linux kernel启动以后会通过App_main进程来初始化android Runtime Java运行环境,而zygote是android的第一个进程。所有的android的应用以及大部分系统服务都是通过zygote fork出来的子进程(我现在看到的只有native的service manager不是由zygote fork出来的)。在system server中启动的若干系统服务中与我们启动进程相关的就是Acitivity Manager。

当systerm server启动好所有服务以后,系统就进入”system ready”状态,这个时候Activity Manager就登场了。Activity Manager光看代码行就知道是一个重量级的服务,它主要管理Activity之间的跳转,以及进程的生命周期。当Activity Manager发现系统已经启动好以后它就会发出一个intent:


Intent intent = new Intent(
mTopAction,
mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
intent.addCategory(Intent.CATEGORY_HOME);
}

通过这个category类型为home的intent,Activity Manager就会通过:
代码如下:startActivityLocked(null, intent, null, null, 0, aInfo, null, null, 0, 0, 0, false, false);

启动Home进程了。而这个启动Home进程的过程实际上还是去通过zygote fork出的一个子进程。因此只要在manifest中具备这样的intent-filter都可以在开机的时候作为Home启动:


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

多个home之间的switch会在开始的时候有个选择,至于这个选择好像是package manager来实现的,没有仔细研究过。

好啦,了解了Lancher是如何执行的,我们再来看看整个lancher内部构造。看看一个lancher如何构造才算是个长得对得起观众的娃:

1、取得系统中所有安装好的应用程序,并提供能运行这些程序的映射(形象的理解就是一个一个应用程序的小图标)。这是Lancher的骨架,正所谓何谓lancher是吧~~如果它不能提供应用程序的访问,再好看也至多是一个华丽的花瓶而已,啥用米有。

2、更好一点我们就需要为这个设计良好的骨架提供一些画皮以及一系列动画效果,就是我们的wallpaper以及一系列的图像,animation,graphic之类的。如果完成这部分工作,基本上我们的Home就基本成型了。

3、要使得我们的GUI更具亲和性更方便使用,我们还提供一些额外的功能,比如说现在lancher实现的图标的拖动,快捷方式等等。这些都是仁者见仁智者见智的事情,取决你天马行空的设计了。

总结起来一个lancher包含3个部分内容:应用程序信息采集,事件处理,动画。下面我们来讲述一个自己的launcher的实现过程:

1、设计

从纯用户的角度来设计你的界面,你希望达到什么样的效果,尽量写得详细。尤其是应用程序信息以如何方式的出现,以及对它的操作一般都是一个好设计的亮点。我们现在设计一个简单的,我们需要一个墙纸,然后在这个墙纸上面有一个条形的控件来显示我们的应用程序图标。选择这些图标以后会在屏幕中间出现一张图表示这个应用程序的功能,然后单击这个图就会打开这个应用程序。

2、设计的总体实现

针对自己的设想来设计这个lancher的整体实现,如果有无法实现的内容就要及时修改设计,或者换一种设计方案。我们这里使用一个 FrameLayout来作为我们的Lancher的容器。然后分层,最下面一层用来放置可能需要的快捷方式以及我们的 wallpaper,然后在wallpaper层上放一个我们自己定义的component来显示我们的应用程序信息。个人觉得FrameLayout是比较适合作为lancher的layout的,它类似于photoshop的图层这样的控制,上面的图层会覆盖下面的图层。

3、具体功能的具体实现

这里具体到代码上就是设计各种java功能类了。对于wallpaper和图标的拖拽移动这里简单提一下,更多的可以去看Android Lancher的实现。wallpaper一般是注册一个broadcastreceiver来处理系统中所有的更改背景图片的请求,而图标的脱拽移动则涉及到Draglayer这个类。

我们来把重点放在如何取得Android已安装的应用程序信息上。这里就涉及到我们另外一个重要的service了,它就是package manager,它负责对安装的包进行管理。这里涉及到一些权限,我是直接照着android lancher的实现把它的权限拷贝过来的:


<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

下面来看看具体的实现,我们创建一个自己的控件,使用LinearLayout来装载ImageSwitcher和Gallery两个控件,用 Gallery来显示获得的应用程序信息,用ImageSwitcher来显示应用程序的介绍,单击ImageSwitcher就能打开相应的应用程序。


public class MyLancherSwitcher extends LinearLayout implements ViewSwitcher.ViewFactory, AdapterView.OnItemSelectedListener,AdapterView.OnItemClickListener{
…………
mImageSwitcher = new ImageSwitcher(context) ;
mGallery = new Gallery(context) ;
this.addView(mImageSwitcher, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,400)) ;
this.addView(mGallery, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 80)) ;
…………
}

架构选好了,下面就是如何为这个两个控件提供已安装的应用程序的信息,首先我们取得package manager :
代码如下:PackageManager manager = this.getContext().getPackageManager();

然后package manager通过intent信息来提供相应的应用程序信息:


Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List<ResolveInfo> apps = manager.queryIntentActivities(mainIntent, 0);
Collections.sort(apps, new ResolveInfo.DisplayNameComparator(manager));

然后我们定义个自己的类MyAppInfo来存储这些取得的信息:


for (int i = 0; i < count; i++) {
MyAppInfo application = new MyAppInfo();
ResolveInfo info = apps.get(i);
application.title = info.loadLabel(manager);
application.setActivity(new ComponentName(
info.activityInfo.applicationInfo.packageName,
info.activityInfo.name),
Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
application.icon = info.activityInfo.loadIcon(manager);
mApplications.add(application);
}
final void setActivity(ComponentName className, int launchFlags) {
intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(className);
intent.setFlags(launchFlags);
}

我们使用一个数组来存储这些MyAppInfo信息,并把它提供给Gallery:


private static ArrayList<MyAppInfo> mApplications;
mGallery.setAdapter(new ApplicationsAdapter(this.getContext(), mApplications)) ;

最后重载ArrayAdapter<MyAppInfo>的getView()函数对画图进行一些裁减就OK了,Gallery就能显示我们的应用程序的图片信息了。最后我们把Gallery中被选中的图片的应用程序信息传给ImageSwitcher,并为ImageSwithcher注册一个按键事件,就可以启动应用程序了:


private OnClickListener mImageSwitcherListener = new OnClickListener(){
public void onClick(View v){
if(mAppInfo == null){}
else
v.getContext().startActivity(mAppInfo.intent);
}
};

这样基本我们lancher的骨架就搞定了,不过还有一个,那就是当我们新安装或删除一个应用程序的时候,我们的Home必须捕获这个intent,并及时调整home里面的应用程序信息,因此我要为我们的控件注册一个package的broadcast receiver :


private class ApplicationsIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
loadApplications(false);
}
}
private void registerIntentReceivers() {
filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
registerReceiver(mApplicationsReceiver, filter);
}

Ok这样我们的lancher就基本完成了,剩下的就是为各个事件添加你需要的动画效果,这里就不说了。以前没有经历过java编程,但是个人觉得 android java应用的编程还是相对简单的,只是因为东西很多所以显得有点复杂,但是基本上使用起来还是很方便的,基本就是继承之后重载或者实现接口,而且 Android为Ui的编程提供了一个更方便的方式就是使用XML,使用xml可以更直观地来进行你的设计,而且也方便了你以后的修改和移植

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

您可能感兴趣的文章:Android ListView的Item点击效果的定制Android快速开发之定制BaseTemplateAndroid实现定制返回按钮动画效果的方法Android定制自己的EditText轻松改变底线颜色Android 组件样式定制方法详解android源码探索之定制android关机界面的方法Android实现的状态栏定制和修改方法Android 如何定制vibrator的各种震动模式M 具体方法Android定制RadioButton样式三种实现方法详解android系统的定制


免责声明:

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

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

Android实现定制桌面的方法

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

下载Word文档

猜你喜欢

Android实现定制桌面的方法

本文实例讲述了Android实现定制桌面的方法。分享给大家供大家参考。具体如下: launcher也就是我们的Home,可以简单地把它理解为一个简化的linux GUI。作为一个GUI它首先必须完成它最本分的功能,就是它必须能提供对所有应用
2022-06-06

Android设置桌面背景图片的实现方法

1.设置桌面背景图片的方法 代码如下: Resources res=getResources(); BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.ico
2022-06-06

Android自定义桌面功能代码实现

先上运行效果图首先我们要把一张自己喜欢的图片放到sdcard中,总之,只要我们可以获取这个图片就可以了。 我这里是放在sdcard中的,可以在eclipse中用鼠标点击导入,比较方便,也可以在命令行中运行: C:\Documents and
2022-06-06

Android编程实现向桌面添加快捷方式的方法

本文实例讲述了Android编程实现向桌面添加快捷方式的方法。分享给大家供大家参考,具体如下: 有时候为了使用方便,需要在桌面上添加快捷方式,下面是两种添加快捷方式的方法: 方法1:void setshortCut() {Intent ad
2022-06-06

Android如何实现桌面快捷方式

这篇文章主要介绍了Android如何实现桌面快捷方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Android 快捷方式使用方式ShortcutUtils.getInsta
2023-06-22

Android定制RadioButton样式三种实现方法

三种方法 1.使用XML文件进行定义 res/drawable/radio.xml 代码如下: 2022-06-06

Android实现的状态栏定制和修改方法

本文实例讲述了Android实现的状态栏定制和修改方法。分享给大家供大家参考。具体如下: 大家都知道定制在android开发中的重要性,因为通过定制,你才能制造出差异化的产品,才能满足更多消费者的需求, 像HTC生产的手机都通过了深层次的二
2022-06-06

设定win7桌面背景的方法

win7桌面上背景壁纸是能够变更的,有一些网民就不太喜欢默认设置的蓝色win7背景,因而改为了别的更能反映人性化的环境。下边我就向大伙儿演示如何设置win7的桌面背景图,因为有一些网民还不太清楚这一步骤。设定win7桌面背景的方法1.打开自
2023-07-24

android源码探索之定制android关机界面的方法

本文实例讲述了android源码探索之定制android关机界面的方法。分享给大家供大家参考。具体如下: 在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。如下图所示:但这些功能都对An
2022-06-06

android 引导界面的实现方法

代码如下:顺序是: OneAcitivity -->MainActivity -> TwoActivity 然后第2次进去就是:OneActivity -> TwoActi
2022-06-06

Android启动画面的实现方法

本文实例讲述了Android启动画面的实现方法。分享给大家供大家参考。具体分析如下: 在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源。 Android要实现启动画面可以这样做: 这是splash.xml布局文件的代码
2022-06-06

Android自定义View实现绘制虚线的方法详解

前言说实话当第一次看到这个需求的时候,第一反应就是Canvas只有drawLine方法,并没有drawDashLine方法啊!这咋整啊,难道要我自己做个遍历不断的drawLine?不到1秒,我就放弃这个想法了,因为太恶心了。方法肯定是有的,
2023-05-31

Android实现定制返回按钮动画效果的方法

今天我们来讲一讲Andorid中如何定制返回按钮的动画效果。我将结合实际应用来阐述如何使用。 首先来看一个效果截图,有一个搜索按钮在一个页面的顶部:我之前实现的方式是和百度/Google首页搜索的效果一样的,类似web开发中的ajax请求,
2022-06-06

Android自定义ViewGroup的实现方法

在android中提供了常见的几种ViewGroup的实现,包括LinearLayout、Relativeayout、FrameLayout等。这些ViewGroup可以满足我们一般的开发需求,但是对于界面要求复杂的,这几个布局就
2022-06-06

Android判断现在所处界面是否为home主桌面的方法

本文实例讲述了Android判断现在所处界面是否为home主桌面的方法。分享给大家供大家参考。具体实现方法如下: private Li
2022-06-06

Android自定义Style实现方法

styles.xml如下: [html] 代码如下: