如何获得Android手机的软件安装列表

如何获得Android手机的软件安装列表,第1张

packageManager.getInstalledApplications()返回一个列表都是安装在设备上的应用程序包。如果我们把 flag GET_UNINSTALLED_PACKAGES设定,一个列表中的所有应用,包括那些设置为dont_delete_data(部分已安装的应用程序的数据目录)将返回。

你可以看到附件中的截图,我们将创建一个列表显示所有已安装的应用程序。

snippet_list_row.xml--------------------这个布局是由ListView适配器用于表示应用程序的细节。它显示应用程序图标、应用程序名称和应用程序包。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" ><ImageView android:id="@+id/app_icon" android:layout_width="50dp" android:layout_height="50dp" android:padding="3dp" android:scaleType="centerCrop" /><LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical" android:orientation="vertical" android:paddingLeft="5dp" ><TextView android:id="@+id/app_name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:textStyle="bold" /><TextView android:id="@+id/app_paackage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" /></LinearLayout></LinearLayout>

AllAppsActivity.java ##这是用于初始化和列表已安装的应用程序的主要应用程序类。从packagemanage得到应用细节列表是一个耗时的任务,我们将在AsyncTask里面做。同时,类使用自定义适配器“自定义listview applicationadapter”。 package com.javatechig.listappsimport java.util.ArrayListimport java.util.Listimport android.app.AlertDialogimport android.app.ListActivityimport android.app.ProgressDialogimport android.content.ActivityNotFoundExceptionimport android.content.DialogInterfaceimport android.content.Intentimport android.content.pm.ApplicationInfoimport android.content.pm.PackageManagerimport android.net.Uriimport android.os.AsyncTaskimport android.os.Bundleimport android.view.Menuimport android.view.MenuInflaterimport android.view.MenuItemimport android.view.Viewimport android.widget.ListViewimport android.widget.Toastpublic class AllAppsActivity extends ListActivity { private PackageManager packageManager = nullprivate List<ApplicationInfo>applist = nullprivate ApplicationAdapter listadaptor = null@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)packageManager = getPackageManager()new LoadApplications().execute()} public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater()inflater.inflate(R.menu.menu, menu)return true} public boolean onOptionsItemSelected(MenuItem item) { boolean result = trueswitch (item.getItemId()) { case R.id.menu_about: { displayAboutDialog()break} default: { result = super.onOptionsItemSelected(item)break} } return result} private void displayAboutDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(this)builder.setTitle(getString(R.string.about_title))builder.setMessage(getString(R.string.about_desc))builder.setPositiveButton("Know More", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://stacktips.com"))startActivity(browserIntent)dialog.cancel()} })builder.setNegativeButton("No Thanks!", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel()} })builder.show()} @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id)ApplicationInfo app = applist.get(position)try { Intent intent = packageManager .getLaunchIntentForPackage(app.packageName)if (null != intent) { startActivity(intent)} } catch (ActivityNotFoundException e) { Toast.makeText(AllAppsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show()} catch (Exception e) { Toast.makeText(AllAppsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show()} } private List<ApplicationInfo>checkForLaunchIntent(List<ApplicationInfo>list) { ArrayList<ApplicationInfo>applist = new ArrayList<ApplicationInfo>()for (ApplicationInfo info : list) { try { if (null != packageManager.getLaunchIntentForPackage(info.packageName)) { applist.add(info)} } catch (Exception e) { e.printStackTrace()} } return applist} private class LoadApplications extends AsyncTask<Void, Void, Void>{ private ProgressDialog progress = null@Override protected Void doInBackground(Void... params) { applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA))listadaptor = new ApplicationAdapter(AllAppsActivity.this, R.layout.snippet_list_row, applist)return null} @Override protected void onCancelled() { super.onCancelled()} @Override protected void onPostExecute(Void result) { setListAdapter(listadaptor)progress.dismiss()super.onPostExecute(result)} @Override protected void onPreExecute() { progress = ProgressDialog.show(AllAppsActivity.this, null, "Loading application info...")super.onPreExecute()} @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values)} }}

package com.javatechig.listappsimport java.util.Listimport android.content.Contextimport android.content.pm.ApplicationInfoimport android.content.pm.PackageManagerimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.ArrayAdapterimport android.widget.ImageViewimport android.widget.TextViewpublic class ApplicationAdapter extends ArrayAdapter<ApplicationInfo>{ private List<ApplicationInfo>appsList = nullprivate Context contextprivate PackageManager packageManagerpublic ApplicationAdapter(Context context, int textViewResourceId, List<ApplicationInfo>appsList) { super(context, textViewResourceId, appsList)this.context = contextthis.appsList = appsListpackageManager = context.getPackageManager()} @Override public int getCount() { return ((null != appsList) ? appsList.size() : 0)} @Override public ApplicationInfo getItem(int position) { return ((null != appsList) ? appsList.get(position) : null)} @Override public long getItemId(int position) { return position} @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertViewif (null == view) { LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE)view = layoutInflater.inflate(R.layout.snippet_list_row, null)} ApplicationInfo applicationInfo = appsList.get(position)if (null != applicationInfo) { TextView appName = (TextView) view.findViewById(R.id.app_name)TextView packageName = (TextView) view.findViewById(R.id.app_paackage)ImageView iconview = (ImageView) view.findViewById(R.id.app_icon)appName.setText(applicationInfo.loadLabel(packageManager))packageName.setText(applicationInfo.packageName)iconview.setImageDrawable(applicationInfo.loadIcon(packageManager))} return view}}

为什么想要App不显示在最近使用过的应用程序列表中?我们知道如果在最近使用过的应用程序列表中将APP划掉,那么这个APP就会被销毁。为了延长APP常驻时间,就希望隐藏APP,不让用户在最近使用过的应用程序列表中将APP销毁。但是这只是一个小手段,用户还是可以到系统设置的应用中销毁APP,不要妄想通过这个方法来保活APP.

实现上面的内容只需要在AndroidManifest中的Activity标签中添加android:excludeFromRecents="true"。

任务是否会在最近使用的应用程序的列表("最近的应用程序")中显示。也就是,当这个活动是根活动的一个新任务,这个属性决定了任务应不应该出现在列表中最近的应用程序。设置"true"如果这个任务应该被排除在名单,设置"false"如果它应该被包括。默认值为"false"。

经过测试,当在被LAUNCHER的Activity设置了android:excludeFromRecents="true",App不显示在最近使用过的应用程序列表中。也就是如下设置

如果MainActivity是LAUNCHER的Activity,而SecondActivity是MainActivity里的一个Button被点击后才启动的,如果在注册清单了给SecondActivity设置了android:excludeFromRecents="true",是无效的,如下设置

但是如果在注册清单里的SecondActivity里设置了android:launchMode="singleInstance",那么,当当前显示的是SecondActivity的时候,App是不会显示在最近使用过的应用程序列表中。

这也正好验证了上面的一句话“当这个活动是根活动的一个新任务,这个属性决定了任务应不应该出现在列表中最近的应用程序。”也就是说只有当这个Activity是处于任务栈根部的时候android:excludeFromRecents="true"才会起作用。但是,如果加了android:launchMode="singleInstance"当我们点击桌面的APP图标的时候,显示的是MainActivity而不是SecondActivity.

最后展示一下什么是最近使用过的应用程序列表:

怎样防止App在后台运行,点击应用桌面图标重新启动?这个问题之前有碰到过,这篇 文章 有解释。本来打算解决上面“加了android:launchMode="singleInstance"后,当APP在后台运行,点击应用桌面图标的时候显示的不是APP进入后台时显示的界面”的问题,但是并没有用,这里记录一下,以后有时间再研究吧。

http://download.csdn.net/detail/lgywsdy/9876908


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7809704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存