一起学android之如何获取手机程序列表以及程序相关信息并启动指定程序 (26)

效果图:

程序列表:

启动程序,获取程序信息:

代码如下:

创建一个AppInfo类来表示应用程序

<pre name="code" class="java">public class AppInfo {
	public CharSequence title;// 程序名
	public CharSequence packageName; // 程序包名
	Intent intent;// 启动Intent
	public Drawable icon;// 程序图标

	/*
	 * 设置启动该程序的Intent
	 */
	final void setActivity(ComponentName className, int launchFlags) {
		intent = new Intent(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);
		intent.setComponent(className);
		intent.setFlags(launchFlags);
	}

}

创建程序列表的适配器:

/**
 * 程序列表适配器
 * @author bill
 *
 */
public class ShowAppListAdapter extends BaseAdapter {
	private ArrayList<AppInfo> appList;
	private LayoutInflater inflater;

	public ShowAppListAdapter(Context context,ArrayList<AppInfo> appList,
			PackageManager pm) {
		this.appList = appList;
		inflater = LayoutInflater.from(context);
	}

	public int getCount() {
		return appList.size();
	}

	public Object getItem(int position) {
		return appList.get(position);
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		final AppInfo info = appList.get(position);
		ViewHolder holder = null;
		if(null == convertView){
			convertView = inflater.inflate(R.layout.app_list_item, null);
			holder = new ViewHolder();
			holder.lv_image = (ImageView) convertView.findViewById(R.id.lv_icon);
			holder.lv_name = (TextView) convertView.findViewById(R.id.lv_item_appname);
			holder.lv_packname = (TextView) convertView.findViewById(R.id.lv_item_packageame);
			convertView.setTag(holder);
		}
		else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.lv_image.setImageDrawable(info.icon);
		final CharSequence name = info.title;
		final CharSequence packName = info.packageName;
		holder.lv_name.setText(name);
		holder.lv_packname.setText(packName);
		return convertView;
	}
	private final static  class ViewHolder{
		ImageView lv_image;
		 TextView lv_name;
		 TextView lv_packname;
	}

}
public class MainActivity extends Activity {
	/*
	 * 应用程序集合
	 */
	private ArrayList<AppInfo> appInfos;
	private ListView lv_app;
	/*
	 * 管理应用程序包,并通过它获取程序信息
	 */
	private PackageManager pm;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.app_list);
		pm = getPackageManager();
		initView();
		new Thread(runable).start();
	}

	private void initView(){
		lv_app = (ListView) findViewById(R.id.app_list_view);
		lv_app.setOnItemClickListener(new AppDetailLinster());
	}

	private final Runnable runable = new Runnable() {

		public void run() {
			loadApplications();
			myHandler.obtainMessage().sendToTarget();
		}

	};

	private Handler myHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			lv_app.setAdapter(new ShowAppListAdapter(MainActivity.this,
					appInfos, pm));

		}

	};

	/**
	 * 加载应用列表
	 */
	private void loadApplications() {
		PackageManager manager = this.getPackageManager();
		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));
		if (apps != null) {
			final int count = apps.size();
			if (appInfos == null) {
				appInfos = new ArrayList<AppInfo>(count);
			}
			appInfos.clear();
			for (int i = 0; i < count; i++) {
				AppInfo application = new AppInfo();
				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);
				application.packageName = info.activityInfo.applicationInfo.packageName;
				appInfos.add(application);
			}
		}
	}

	/**
	 * 列表监听类
	 * @author bill
	 *
	 */
	public final class AppDetailLinster implements OnItemClickListener {

		AlertDialog dialog;

		public void onItemClick(AdapterView<?> view, View arg1,
				final int position, long arg3) {
			AlertDialog.Builder builder = new AlertDialog.Builder(
					MainActivity.this);
			builder.setTitle("选项");
			builder.setItems(R.array.choice, new OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					final AppInfo appInfo = appInfos.get(position);
					switch (which) {
					case 0: // 启动程序
						try {
							startApp(appInfo);
						} catch (Exception e) {

						}
						break;
					case 1: // 详细信息
						try {
							showAppDetail(appInfo);
						} catch (Exception e) {

						}
						break;

					}
					dialog.dismiss();
				}

				private void showAppDetail(AppInfo appInfo)
						throws Exception {
					final String packName = appInfo.packageName.toString();
					final PackageInfo packInfo = getAppPackinfo(packName);
					final String versionName = packInfo.versionName;
					final String[] apppremissions = packInfo.requestedPermissions;
					final String appName = appInfo.title.toString();
					Intent showDetailIntent = new Intent(MainActivity.this,
							ShowAppDetailActivity.class);
					Bundle bundle = new Bundle();
					bundle.putString("packagename", packName);
					bundle.putString("appversion", versionName);
					bundle.putStringArray("apppremissions", apppremissions);
					bundle.putString("appname", appName);
					showDetailIntent.putExtras(bundle);
					startActivity(showDetailIntent);

				}

				private void startApp(AppInfo appInfo)
						throws Exception {
					final String packName = appInfo.packageName.toString();
					final String activityName = getActivityName(packName);
					if (null == activityName) {
						Toast.makeText(MainActivity.this, "程序无法启动",
								Toast.LENGTH_SHORT);
						return;
					}
					Intent intent = new Intent();
					intent.setComponent(new ComponentName(packName,
							activityName));
					startActivity(intent);
				}

			});
			dialog = builder.create();
			dialog.show();

		}

	}
	/**
	 * 获取程序信息
	 * @param packName
	 * @return
	 * @throws Exception
	 */
	public PackageInfo getAppPackinfo(String packName) throws Exception {
		return pm.getPackageInfo(packName, PackageManager.GET_ACTIVITIES
				| PackageManager.GET_PERMISSIONS);
	}

	/**
	 * 获取启动相关程序的Activity
	 * @param packName
	 * @return
	 * @throws Exception
	 */
	public String getActivityName(String packName) throws Exception {
		final PackageInfo packInfo = pm.getPackageInfo(packName,
				PackageManager.GET_ACTIVITIES);
		final ActivityInfo[] activitys = packInfo.activities;
		if (null == activitys || activitys.length <= 0) {
			return null;
		}
		return activitys[0].name;
	}
}

app_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@android:color/black" >

    <ListView
        android:id="@+id/app_list_view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
      >
    </ListView>

</RelativeLayout>

app_list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="fill_parent"
	android:layout_height="wrap_content" android:gravity="center_vertical">

	<ImageView
		android:id="@+id/lv_icon"
		android:layout_width="48px"
		android:layout_height="48px"
		android:layout_marginTop="5px"
		android:layout_marginBottom="5px"
	></ImageView>
	<LinearLayout
		android:orientation="vertical"
		android:layout_width="wrap_content"
		android:layout_height="48px"
		android:paddingLeft="5px"
		>
		<TextView
			android:id="@+id/lv_item_appname"
			android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:singleLine="true"
			android:textSize="16px"
			android:textStyle="bold"
			android:textColor="#fff"
		></TextView>

		<TextView
			android:id="@+id/lv_item_packageame"
			android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:singleLine="true"
			android:textColor="#fff"
		></TextView>

	</LinearLayout>
</LinearLayout>
/**
 * 查看应用信息
 * @author bill
 *
 */
public class ShowAppDetailActivity extends Activity {

	private TextView tv_appname;
	private TextView tv_appversion;
	private TextView tv_packagename;
	private TextView tv_permission;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.app_detial);
		tv_appname = (TextView) findViewById(R.id.detail_app_name);
		tv_appversion = (TextView) findViewById(R.id.detail_app_version);
		tv_packagename = (TextView) findViewById(R.id.detail_app_packname);
		tv_permission = (TextView) findViewById(R.id.detail_app_permissions);
		Bundle bundle = this.getIntent().getExtras();
		String packagename=  bundle.getString("packagename");
		String appversion = bundle.getString("appversion");
		String appname = bundle.getString("appname");
		String[] appPremissions = bundle.getStringArray("apppremissions");
		StringBuilder sb = new StringBuilder();
		for(String s : appPremissions){
			sb.append(s);
			sb.append("\n");
		}
		tv_appname.setText(appname);
		tv_appversion.setText(appversion);
		tv_packagename.setText(packagename);
		tv_permission.setText(sb.toString());
	}
}

app_detial.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"
    >
    <TableLayout
        android:id="@+id/app_table"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TableRow
              android:id="@+id/tableRow1"
      		  android:layout_width="wrap_content"
      		  android:layout_height="wrap_content"
            >
            <TextView
                android:layout_width="wrap_content"
    			android:layout_height="wrap_content"
    			android:text="程序名字"
	    	/>
	    	<TextView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:id="@+id/detail_app_name"
	    	/>
        </TableRow>

        <TableRow
	        android:id="@+id/tableRow2"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content">
	    	 <TextView
	    	     android:layout_width="wrap_content"
    			 android:layout_height="wrap_content"
    			 android:text="程序版本"
	    	/>
	    	<TextView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:id="@+id/detail_app_version"
	    	/>
	    </TableRow>
         <TableRow
	         android:id="@+id/tableRow3"
	         android:layout_width="wrap_content"
	         android:layout_height="wrap_content">
	    	 <TextView
	    	     android:layout_width="wrap_content"
    			 android:layout_height="wrap_content"
    			 android:text="程序包名"
	    	/>
	    	<TextView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:id="@+id/detail_app_packname"
	    	/>
	    </TableRow>
	     <TableRow
	         android:id="@+id/tableRow4"
	         android:layout_width="wrap_content"
	         android:layout_height="wrap_content">
             <TextView
                 android:layout_width="wrap_content"
    			 android:layout_height="wrap_content"
    			 android:text="程序权限"
		    />
		    <TextView
		        android:layout_width="wrap_content"
		    	android:layout_height="wrap_content"
		        android:id="@+id/detail_app_permissions"
		    	/>
         </TableRow>
    </TableLayout>

</LinearLayout>

最后别忘了配置AndroidManifest。

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/44274387情绪控_

时间: 2024-10-13 04:54:49

一起学android之如何获取手机程序列表以及程序相关信息并启动指定程序 (26)的相关文章

开机延迟启动指定程序的VBS脚本

我有一个程序,希望它开机自动启动且最小化运行,但这个程序没有提供设置开机启动的功能.如果把它的快捷方式加入到“启动”文件夹中,对开机速度会有比较大的影响,且启动后不会自行最小化. 为达到这个目的,我想编写一小段vbs脚本,开机时运行脚本,由脚本来实现延时一段时间后以最小化窗口的方式启动指定程序的功能.查了一下资料,发现只需使用WScript.Shell.Run和WScript.Sleep即可实现. WScript.Shell是WSH提供的一个工具对象,可用来与特殊文件夹交互,如Desktop和M

Android开发之获取手机SIM卡信息

TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设备上的电话服务信息. 应用程序能够使用这个类的方法来确定电话服务和状态,以及訪问某些类型的用户信息.应用程序还能够注冊一个侦听器以接收的电话状态变化通知. 你不能直接实例化这个类;相反,你能够通过Context.getSystemService(Context.TELEPHONY_SERVICE)方

Android 监听获取手机短信内容

Android开发的时候,有时候需要获取手机信息内容的情况,这里有种获取发送过来信息的监听方法: public class SmsReciver extends BroadcastReceiver{} //2,获取短信内容 Object[] objects = (Object[]) intent.getExtras().get("pdus"); //3,循环遍历短信过程 for (Object object : objects) { //4,获取短信对象 SmsMessage sms

android 安卓APP获取手机设备信息和手机号码的代码示例

下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓手机.手机SIM卡确保插入手机里.eclipse ADT和android-sdk开发环境 第一步:新建一个android工程(JinshanTest), 并需要在工程的AndroidManifest.xml文件中,添加权限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 图例: 第二步:新建一个工具类

Android开发之获取手机通讯录

获取手机通讯录是Android最常用的小功能,今天自学到了,记下来,主要是通过系统自带的内容提供者提供的数据,我们使用内容接收者获取相应的数据到cursor中,然后获取对应data表中的字段,相关字段代表什么含义,只能自己去查了. 下面是手机通讯录列表的代码,仅供参考: package com.andy.phonecontact; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import

【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 [java] view plaincopyprint? PackageManager packageManager = this.getPackageManager(); List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0); 通过以上方法,可以得到手机中安装的所有应用程序,既包括了手动安装的apk包的信

Android学习笔记-获取手机内存,SD卡存储空间。

前面介绍到如何保存数据到手机内存或者SD卡,但是问题是,在保存以前,我们还需要对他们的空间(可用空间),进行判断,才可以进行后续操作,所以,本节我们就介绍如何获取手机内存以及Sd卡的空间. //这时获取手机内存的 // File path = Environment.getDataDirectory(); //这时获取SD卡的空间 File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(pat

一起学android之如何获取Android设备的唯一识别码笔记(21)

因为需要在项目中需要获得一个稳定.可靠的设备唯一识别码,因此搜了一些网上的资料.今天我们将介绍几种方式. 1. DEVICE_ID 假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID.在以前,我们的Android设备是手机,这个 DEVICE_ID可以同通过TelephonyManager.getDeviceId()获取,它根据不同的手机设备返回IMEI,MEID或者ESN 码,但它在使用的过程中会遇到很多问题: 非手机设备: 如果只带有Wifi的设备或者音乐播放器没有通话的硬

一起学android之如何获取网络类型并判断是否可用(20)

ConnectivityManager主要管理和网络连接相关的操作,通过getSystemService(Context.CONNECTIVITY_SERVICE)获 取网络连接的服务.因此我们可以通过ConnectivityManager这个类下的getActiveNetworkInfo()方法来获取当前的网络 连接状态,这个方法返回的是NetworkInfo对象, NetworkInfo描述了当前网络Mobile和Wifi的状态.NetworkInfo类中有 三个方法:(1)getType(