第一步,把我們的應用程式作為home(即實現按下home鍵,啟動自己的launcher.)
要把我們的應用程式作為home,只需要在AndroidManifest.xml中添加:
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.bangchui.myhome" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MyHome" 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>
第二步,列出安裝的應用程式
列出已經安裝的應用程式是作為launcher比不可少的功能。下面我們就講解怎樣將應用程式列出來。程式運行後的樣子如下:
1. 修改main.xml,在其中添加一個GridView用來顯示應用程式列表。
main.xml <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <GridView android:layout_width="match_parent" android:id="@+id/apps_list" android:numColumns="4" android:layout_height="wrap_content"> </GridView> </LinearLayout
2 . 通過PackageManager的api 查詢已經安裝的apk
privatevoid loadApps() {
Intent mainIntent =new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
}
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(MyHome.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; }
4.監聽GridView的onItemClick事件
設定一個監聽器是為了當gridView的某項被點擊時,會有一個回呼函數通知我們。
我們調用mGrid.setOnItemClickListener(listener); 設定一個監聽器
mGrid.setOnItemClickListener(listener)中的listener是一個介面,其類型為:android.widget.AdapterView.OnItemClickListener
private OnItemClickListener listener =new OnItemClickListener() {
@Override
publicvoid onItemClick(AdapterView<?> parent, View view, int position,long id) {
//事件內容....
}
};
5.啟動被點擊應用的activity
一般來講,我們根據position即可知道被點擊的項目是哪一項了。現在我們根據被點擊的項目,取出對應的應用程式資料(主要是其中的主activity),然後啟動activity。用下面代碼實現:
publicvoid 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);
}
最後整個Activity的代碼如下:
MyHome.javapackage org.bangchui.myhome;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.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;import android.widget.AdapterView.OnItemClickListener;public class MyHome extends Activity { private List<ResolveInfo> mApps; GridView mGrid; 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); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); loadApps(); setContentView(R.layout.main); mGrid = (GridView) findViewById(R.id.apps_list); mGrid.setAdapter(new AppsAdapter()); mGrid.setOnItemClickListener(listener); } 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(MyHome.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; } }}
轉載自:http://www.cnblogs.com/playing/archive/2011/04/13/2014705.html