实战开发中时不时会涉及到有关本地 app 的操作,在此奉上一些渣文字 and 渣代码~~
PackageManager类
本地app主要是通过PackageManager这个类来管理的,它的功能包括——
- 安装,卸载,查询应用
- 查询应用组件(就是四大组件啦,学Android的都知道)信息
- 添加,删除,查询应用权限
- 清除用户数据,缓存,代码段
PackageManager类可以通过getPackageManager()方法获取,需要一个上下文(Context)环境。
PackageManager类的常用方法
这些方法涉及到PackageInfo和ApplicationInfo类,后面会讲——
**ApplicationInfo getApplicationInfo(String packageName, int flags) **
参数为app包名+flag标记(通常0即可)
返回与包名对应的ApplicationInfo对象;需要处理NameNotFoundException异常**PackageInfo getPackageInfo(String packageName, int flags) **
参数为包名+标记
返回对应的PackageInfo对象;需要处理NameNotFoundException异常List<PackageInfo> getInstalledPackages(int flags)
参数为标记,有时你应该根据需要,对其进行过滤
如果不过滤直接传0,那会返回所有(系统+非系统)的PackageInfo对象集合
另外就是还有一些有关ResolveInfo类(集合)的方法,此类直接指向<activity>,<receiver>,<service>等节点!
已经超出本文范围就不详述了~~(哼,懒就直说嘛)
PackageInfo类
此类用于手动获取AndroidManifest.xml文件信息
注意它已实现Parcelable接口,因此可直接通过Intent或者Bundle传递!
常用方法——
String packageName()
返回此Info对应的包名ApplicationInfo applicationInfo()
返回对应的ApplicationInfo对象
ApplicationInfo类
此类继承自PackageItemInfo类(AndroidManifest.xml里所有文件的基类哦),可以调用<label>,<icon>,<meta-data>等节点的信息
注意它已实现Parcelable接口。
常用方法——
Drawable loadIcon(PackageManager pm)
参数为PackageManager对象,返回对应app的图标(Drawable对象)CharSequence loadLabel(PackageManager pm)
参数为PackageManager对象,返回对应app的应用名
Demo
废话8完上代码,这是一个列表显示本机所有app(过滤掉了系统自带的)的demo。点击条目,可启动条目对应的app。
注意这只是一个demo而已,没有优化(主要是图像加载这一块),跑起来略卡!
真正的app管理应用,应该引入UIL或者Picasso一类的加载库进行图标加载,有时还需要重写RecycleView类的onScrollStateChanged()方法;应用列表要按一定规则排序,点击打开应用时最好再添个切换动画。在此就不赘述了~~(又他喵懒了)
gradle依赖
注意appcompat-v7包和design包的版本号不能照抄,它的值应不大于buildToolsVersion的版本号
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.0.0'
compile 'com.makeramen:roundedimageview:2.2.1'
compile 'com.jakewharton:butterknife:7.0.1'
主布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.jin.localapp.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/main_rcv"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
条目布局item_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/item_icon_iv"
android:layout_margin="12dp"
android:layout_centerVertical="true"
android:layout_width="32dp"
android:layout_height="32dp" />
<TextView
android:id="@+id/item_name_tv"
android:textSize="17dp"
android:layout_toRightOf="@+id/item_icon_iv"
android:layout_marginTop="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/item_package_tv"
android:textSize="14dp"
android:layout_toRightOf="@+id/item_icon_iv"
android:layout_alignParentBottom="true"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:src="@drawable/item_arrow"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:background="#dddddd"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="1dp"/>
</RelativeLayout>
条目中箭头的代码item_arrow.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#dddddd"
android:pathData="M9.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z"/>
</vector>
主界面MainActivity.java
package com.example.jin.localapp;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.main_rcv)
RecyclerView mainRcv;
private List<PackageInfo> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initData();
}
private void initData() {
mList = new ArrayList<>();
List<PackageInfo> list = getPackageManager().getInstalledPackages(0);//获取已安装的全部应用
for (PackageInfo info : list) {
if ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
mList.add(info);//只添加非系统应用
}
}
mainRcv.setLayoutManager(new LinearLayoutManager(this));
mainRcv.setHasFixedSize(true);
mainRcv.setAdapter(new AppAdapter(this, mList));
}
}
适配器AppAdapter.java
package com.example.jin.localapp;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.makeramen.roundedimageview.RoundedImageView;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by Jin on 2016/11/8.
*/
public class AppAdapter extends RecyclerView.Adapter<AppAdapter.AppHolder> {
private Context context;
private List<PackageInfo> appList;
private LayoutInflater inflater;
private PackageManager manager;
public AppAdapter(Context context, List<PackageInfo> appList) {
this.context = context;
this.appList = appList;
inflater = LayoutInflater.from(context);
manager = context.getPackageManager();
}
@Override
public AppHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new AppHolder(inflater.inflate(R.layout.item_app, parent, false));
}
@Override
public int getItemCount() {
return appList.size();
}
@Override
public void onBindViewHolder(AppHolder holder, int position) {
final PackageInfo info = appList.get(position);
holder.itemIconIv.setBackground(info.applicationInfo.loadIcon(manager));//应用图标
holder.itemNameTv.setText(info.applicationInfo.loadLabel(manager));//名称
holder.itemPackageTv.setText(info.packageName);//包名
holder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(manager.getLaunchIntentForPackage(info.packageName));//根据包名启动此应用
context.startActivity(intent);
}
});
}
static class AppHolder extends RecyclerView.ViewHolder {
@Bind(R.id.item_icon_iv)
RoundedImageView itemIconIv;
@Bind(R.id.item_name_tv)
TextView itemNameTv;
@Bind(R.id.item_package_tv)
TextView itemPackageTv;
View view;
AppHolder(View view) {
super(view);
ButterKnife.bind(this, view);
this.view = view;
}
}
}