废话不多说 直接上代码
自己做了一个简单的界面,显示出当前手机的应用列表,点击以后并实现跳转。
界面布局文件:
布局文件,只有一个ListViewListView的Item布局文件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="70dp">
<ImageView
android:id="@+id/iv_app_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"/>
<TextView
android:id="@+id/tv_app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:layout_toEndOf="@+id/iv_app_icon"
android:layout_toRightOf="@+id/iv_app_icon"
android:singleLine="true"
android:text="应用名称"/>
<TextView
android:id="@+id/tv_app_class_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:layout_toEndOf="@+id/iv_app_icon"
android:layout_toRightOf="@+id/iv_app_icon"
android:singleLine="true"
android:text="应用包名"/>
<TextView
android:id="@+id/tv_app_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:layout_below="@id/tv_app_class_name"
android:layout_toEndOf="@+id/iv_app_icon"
android:layout_toRightOf="@+id/iv_app_icon"
android:singleLine="true"
android:text="应用版本号"/>
</RelativeLayout>
</LinearLayout>
一个ListView显示一个应用的icon、应用名称、包名和版本号。
下来是Java代码:
public classAppActivityextendsActivity{
privateListViewlv_app_list;
privateAppAdaptermAppAdapter;
publicHandlermHandler=newHandler();
@Override
protected voidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app);
lv_app_list=(ListView)findViewById(R.id.lv_app_list);
mAppAdapter=newAppAdapter();
lv_app_list.setAdapter(mAppAdapter);
lv_app_list.setOnItemClickListener(newAdapterView.OnItemClickListener() {
@Override
public voidonItemClick(AdapterViewparent,Viewview,intposition,longid) {
//Toast.makeText(AppActivity.this, mAppAdapter.getData().get(position).getAppName(), Toast.LENGTH_SHORT).show();
doStartApplicationWithPackageName(mAppAdapter.getData().get(position).getAppClassName());
}
});
initAppList();
}
private voidinitAppList(){
newThread(){
@Override
public voidrun() {
super.run();
//扫描得到APP列表
finalListappInfos=ApkTool.scanLocalInstallAppList(AppActivity.this.getPackageManager());
mHandler.post(newRunnable() {
@Override
public voidrun() {
mAppAdapter.setData(appInfos);
}
});
}
}.start();
}
classAppAdapterextendsBaseAdapter{
ListmyAppInfos=newArrayList();
public voidsetData(ListmyAppInfos) {
this.myAppInfos=myAppInfos;
notifyDataSetChanged();
}
publicListgetData() {
returnmyAppInfos;
}
@Override
public intgetCount() {
if(myAppInfos!=null&&myAppInfos.size()>0) {
returnmyAppInfos.size();
}
return0;
}
@Override
publicObjectgetItem(intposition) {
if(myAppInfos!=null&&myAppInfos.size()>0) {
returnmyAppInfos.get(position);
}
return null;
}
@Override
public longgetItemId(intposition) {
return0;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) {
ViewHoldermViewHolder;
MyAppInfomyAppInfo=myAppInfos.get(position);
if(convertView==null) {
mViewHolder=newViewHolder();
convertView=LayoutInflater.from(getBaseContext()).inflate(R.layout.item_app_info,null);
mViewHolder.iv_app_icon=(ImageView)convertView.findViewById(R.id.iv_app_icon);
mViewHolder.tx_app_name=(TextView)convertView.findViewById(R.id.tv_app_name);
mViewHolder.tx_app_class_name=(TextView)convertView.findViewById(R.id.tv_app_class_name);
mViewHolder.tx_app_version=(TextView)convertView.findViewById(R.id.tv_app_version);
convertView.setTag(mViewHolder);
}else{
mViewHolder=(ViewHolder)convertView.getTag();
}
mViewHolder.iv_app_icon.setImageDrawable(myAppInfo.getImage());
mViewHolder.tx_app_name.setText(myAppInfo.getAppName());
mViewHolder.tx_app_class_name.setText(myAppInfo.getAppClassName());
mViewHolder.tx_app_version.setText(myAppInfo.getVersion());
returnconvertView;
}
classViewHolder{
ImageViewiv_app_icon;
TextViewtx_app_name,tx_app_class_name,tx_app_version;
}
}
private voiddoStartApplicationWithPackageName(Stringpackagename) {
//通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等
PackageInfopackageinfo=null;
try{
packageinfo=getPackageManager().getPackageInfo(packagename,0);
}catch(PackageManager.NameNotFoundExceptione) {
e.printStackTrace();
}
if(packageinfo==null) {
return;
}
//创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
IntentresolveIntent=newIntent(Intent.ACTION_MAIN,null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(packageinfo.packageName);
//通过getPackageManager()的queryIntentActivities方法遍历
ListresolveinfoList=getPackageManager()
.queryIntentActivities(resolveIntent,0);
ResolveInforesolveinfo=resolveinfoList.iterator().next();
if(resolveinfo!=null) {
// packagename =参数packname
StringpackageName=resolveinfo.activityInfo.packageName;
//这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]
StringclassName=resolveinfo.activityInfo.name;
// LAUNCHER Intent
Intentintent=newIntent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
//设置ComponentName参数1:packagename参数2:MainActivity路径
ComponentNamecn=newComponentName(packageName,className);
intent.setComponent(cn);
startActivity(intent);
}
}
}
用到的工具类 ApkTool:
public class ApkTool{
static String TAG="ApkTool";
public staticListmLocalInstallApps=null;
public staticListscanLocalInstallAppList(PackageManagerpackageManager) {
ListmyAppInfos=newArrayList();
try{
ListpackageInfos=packageManager.getInstalledPackages(0);
for(inti=0;i
PackageInfopackageInfo=packageInfos.get(i);
//过滤掉系统app
//if ((ApplicationInfo.FLAG_SYSTEM & packageInfo.applicationInfo.flags) != 0) {
// continue;
//}
MyAppInfomyAppInfo=newMyAppInfo();
ApplicationInfoinfo=packageInfo.applicationInfo;
myAppInfo.setAppName(info.loadLabel(packageManager).toString());
myAppInfo.setAppClassName(packageInfo.packageName);
myAppInfo.setVersion(String.valueOf(packageInfo.versionName));
if(packageInfo.applicationInfo.loadIcon(packageManager)==null) {
continue;
}
myAppInfo.setImage(packageInfo.applicationInfo.loadIcon(packageManager));
myAppInfos.add(myAppInfo);
}
}catch(Exceptione){
Log.e(TAG,"===============获取应用包信息失败");
}
returnmyAppInfos;
}
}
以上就是所有有关的代码,下面贴上一张效果图
显示出手机APP列表并包括详细信息,点击以后跳转到相应应用--DemoHandler
保存下来,总有一天,你会用到。
CoderTung 的第 3 篇知识储备。
网友评论