因为在开发过程中需要开启扫描第三方程序,并且点击启动的效果,所以对这个功能进行了实现,并且分享出来个大家。
之前看到网上说需要获取包名和类名,然后通过 intent 才能打开这个程序,其实不必要这样。
在android API中,有这么一个接口,
实际说的就是传入包名即可返回Intent,继而startActivity 即可打开第三方程序了。
以下是Demo:
界面 GetApplicationActivity.
public class GetApplicationActivity extends Activity implements OnItemClickListener { private GetApplicationAdpater mGetApplicationAdpater; private ArrayList<ApplicationData> applicationDatas; private ArrayList<ApplicationData> tempApplicationDatas; private ListView mListView; private PackageManager mPackageManager; private static final int Refresh_List_View = 0x001; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.application_list); initData(); } private void initData() { applicationDatas = new ArrayList<ApplicationData>(); tempApplicationDatas = new ArrayList<ApplicationData>(); mGetApplicationAdpater = new GetApplicationAdpater(this, applicationDatas); mListView.setAdapter(mGetApplicationAdpater); mListView.setOnItemClickListener(this); getData(); mPackageManager = getPackageManager(); } private void getData() { GetApplicationAsyncTask mGetApplicationAsyncTask = new GetApplicationAsyncTask(); mGetApplicationAsyncTask.getApplicationList(this, new GetApplicationList() { @Override public void dataCallback( ArrayList<ApplicationData> applicationDatas) { if (applicationDatas != null) { tempApplicationDatas = applicationDatas; } mHandler.sendEmptyMessage(Refresh_List_View); } }); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case Refresh_List_View: int count = tempApplicationDatas.size(); applicationDatas.clear(); for (int i = 0; i < count; i++) { applicationDatas.add(tempApplicationDatas.get(i)); } mGetApplicationAdpater.notifyDataSetChanged(); break; default: break; } }; }; @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub String packageName = applicationDatas.get(position).getPackageName(); Intent i = mPackageManager.getLaunchIntentForPackage(packageName); if (i != null) startActivity(i); } }
java
适配器 GetApplicationAdpater.java
public class GetApplicationAdpater extends BaseAdapter{ private ArrayList<ApplicationData> applicationDatas; private LayoutInflater mLayoutInflater; public GetApplicationAdpater(Context context,ArrayList<ApplicationData> applicationDatas) { super(); this.applicationDatas = applicationDatas; mLayoutInflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return applicationDatas.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return applicationDatas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder mViewHolder; ApplicationData mApplicationData = applicationDatas .get(position); if (convertView == null) { mViewHolder = new ViewHolder(); convertView = mLayoutInflater .inflate(R.layout.list_item_view, null); mViewHolder.image = (ImageView) convertView .findViewById(R.id.image); mViewHolder.title = (TextView) convertView.findViewById(R.id.title); convertView.setTag(mViewHolder); } else { mViewHolder = (ViewHolder) convertView.getTag(); } mViewHolder.image.setImageDrawable(mApplicationData.getiCon()); mViewHolder.title.setText(mApplicationData.getAppName()); return convertView; } public final class ViewHolder { public ImageView image; public TextView title; } }
获取程序包名类 GetApplicationAsyncTask.java
public class GetApplicationAsyncTask extends AsyncTask<Integer, Integer, String> { private GetApplicationList mGetApplicationList; private ArrayList<ApplicationData> applicationDatas; private Context mContext; @Override protected String doInBackground(Integer... params) { PackageManager mPackageManager = mContext.getPackageManager(); List<PackageInfo> packageInfos = mPackageManager .getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); 获取程序列表 applicationDatas = new ArrayList<ApplicationData>(); for (PackageInfo packs : packageInfos) { if((packs.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0) //主要过滤系统的程序 { ApplicationData mApplicationData= new ApplicationData(); mApplicationData.setiCon(packs.applicationInfo.loadIcon(mPackageManager)); mApplicationData.setAppName(packs.applicationInfo.loadLabel(mPackageManager).toString()); mApplicationData.setPackageName(packs.packageName); applicationDatas.add(mApplicationData); } } return null; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub mGetApplicationList.dataCallback(applicationDatas); } public void getApplicationList(Context context, GetApplicationList getApplicationList) { this.mGetApplicationList = getApplicationList; this.mContext = context; this.execute(); } public interface GetApplicationList { public void dataCallback(ArrayList<ApplicationData> applicationDatas); } }
代码比较简单,我就不做解释了。