獲取android手機裏的所有應用,點擊並響應
在此我寫一個找到android手機裏的所有已裝應用程序(android手機自帶的也行),點擊某個應用時,將做出響應 。
先看一下效果圖:
當點擊《憤怒的小鳥》時,將打開《憤怒的小鳥》這個遊戲
main.xml的源代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <GridView xmlns:android="https://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>
接著是apps.xml,源代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="https://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" />
- </LinearLayout>
接下來就是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();
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- 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 {
- @Override
- 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;
- }
- }
- }
最後更新:2017-04-02 06:51:55