下面来看看具体的实现,我们创建一个自己的控件,使用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 apps = manager.queryIntentActivities(mainIntent, 0);
Collections.sort(apps, new ResolveInfo.DisplayNameComparator(manager));
然后我们定义个自己的类MyAppInfo来存储这些取得的信息:
for (int i = 0; i mApplications;
mGallery.setAdapter(new ApplicationsAdapter(this.getContext(), mApplications)) ;
最后重载ArrayAdapter 的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);
}
}