在此我寫一個找到android手機裡的所有已裝應用程式(android手機自帶的也行),點選某個應用時,将做出響應 。
先看一下效果圖:
當點選《憤怒的小鳥》時,将打開《憤怒的小鳥》這個遊戲
main.xml的源代碼如下:
view plaincopy
to clipboardprint?
<?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 xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numcolumns="auto_fit"
android:verticalspacing="15dp"
android:horizontalspacing="12dp"
android:columnwidth="95dp"
android:stretchmode="columnwidth"
android:gravity="center"
/>
</linearlayout>
<?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 xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:numcolumns="auto_fit"
android:verticalspacing="15dp"
android:horizontalspacing="12dp"
android:columnwidth="95dp"
android:stretchmode="columnwidth"
android:gravity="center"
/>
</linearlayout>
接着是apps.xml,源代碼如下:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center" >
<imageview
android:id="@+id/apps_image"
android:layout_width="48dip"
android:layout_height="48dip"
android:icon="@drawable/icon" />
<textview
android:id="@+id/apps_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxlines="1"
android:maxems="5"
android:text="good" />
android:gravity="center" >
<imageview
android:id="@+id/apps_image"
android:layout_width="48dip"
android:layout_height="48dip"
android:icon="@drawable/icon" />
<textview
android:id="@+id/apps_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxlines="1"
android:maxems="5"
android:text="good" />
接下來就是java源代碼了,比較長,希望耐心看下去
package com.android.game;
import java.util.arraylist;
import java.util.list;
import android.app.activity;
import android.content.context;
import android.content.intent;
import android.content.pm.packageinfo;
import android.content.pm.packagemanager;
import android.graphics.drawable.drawable;
import android.os.bundle;
import android.view.layoutinflater;
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.textview;
import android.widget.adapterview.onitemclicklistener;
public class apps extends activity {
// 用來記錄應用程式的資訊
list<appsiteminfo> list;
private gridview gridview;
private packagemanager pmanager;
@override
protected void oncreate(bundle savedinstancestate) {
// todo auto-generated method stub
super.oncreate(savedinstancestate);
this.setcontentview(r.layout.main);
// 取得gridview
gridview = (gridview) findviewbyid(r.id.gridview);
// 擷取圖檔、應用名、包名
pmanager = apps.this.getpackagemanager();
list<packageinfo> applist = getallapps(apps.this);
list = new arraylist<appsiteminfo>();
for (int i = 0; i < applist.size(); i++) {
packageinfo pinfo = applist.get(i);
appsiteminfo shareitem = new appsiteminfo();
// 設定圖檔
shareitem.seticon(pmanager
.getapplicationicon(pinfo.applicationinfo));
// 設定應用程式名字
shareitem.setlabel(pmanager.getapplicationlabel(
pinfo.applicationinfo).tostring());
// 設定應用程式的包名
shareitem.setpackagename(pinfo.applicationinfo.packagename);
list.add(shareitem);
}
// 設定gridview的adapter
gridview.setadapter(new baseadapter());
// 點選應用圖示時,做出響應
gridview.setonitemclicklistener(new clicklistener());
}
public static list<packageinfo> getallapps(context context) {
list<packageinfo> apps = new arraylist<packageinfo>();
packagemanager pmanager = context.getpackagemanager();
// 擷取手機内所有應用
list<packageinfo> packlist = pmanager.getinstalledpackages(0);
for (int i = 0; i < packlist.size(); i++) {
packageinfo pak = (packageinfo) packlist.get(i);
// 判斷是否為非系統預裝的應用程式
// 這裡還可以添加系統自帶的,這裡就先不添加了,如果有需要可以自己添加
// if()裡的值如果<=0則為自己裝的程式,否則為系統工程自帶
if ((pak.applicationinfo.flags & pak.applicationinfo.flag_system) <= 0) {
// 添加自己已經安裝的應用程式
apps.add(pak);
}
return apps;
private class baseadapter extends baseadapter {
layoutinflater inflater = layoutinflater.from(apps.this);
@override
public int getcount() {
// todo auto-generated method stub
return list.size();
public object getitem(int position) {
return null;
public long getitemid(int position) {
return position;
public view getview(int position, view convertview, viewgroup parent) {
viewholder holder;
if (convertview == null) {
// 使用view的對象itemview與r.layout.item關聯
convertview = inflater.inflate(r.layout.apps, null);
holder = new viewholder();
holder.icon = (imageview) convertview
.findviewbyid(r.id.apps_image);
holder.label = (textview) convertview
.findviewbyid(r.id.apps_textview);
convertview.settag(holder);
} else {
holder = (viewholder) convertview.gettag();
holder.icon.setimagedrawable(list.get(position).geticon());
holder.label.settext(list.get(position).getlabel().tostring());
return convertview;
// 當使用者點選應用程式圖示時,将對這個類做出響應
private class clicklistener implements onitemclicklistener {
public void onitemclick(adapterview<?> arg0, view arg1, int arg2,
long arg3) {
// 将應用所選的應用程式資訊共享到application中
myapp appstate = ((myapp) getapplicationcontext());
// 擷取目前所在頁籤
string tab_id = appstate.gettab_id();
// 設定所選應用程式資訊
appstate.set_appinfo(tab_id, list.get(arg2).getlabel(), list.get(
arg2).geticon(), list.get(arg2).getpackagename());
intent intent = new intent(apps.this, game.class);
startactivity(intent);
// 銷毀目前activity
finish();
// 自定義一個 appsiteminfo 類,用來存儲應用程式的相關資訊
private class appsiteminfo {
private drawable icon; // 存放圖檔
private string label; // 存放應用程式名
private string packagename; // 存放應用程式包名
public drawable geticon() {
return icon;
public void seticon(drawable icon) {
this.icon = icon;
public string getlabel() {
return label;
public void setlabel(string label) {
this.label = label;
public string getpackagename() {
return packagename;
public void setpackagename(string packagename) {
this.packagename = packagename;
}