看了网上 PackageManager 和 ActivityManager ,看到有一个列出所有App的例子,就做了下面的launcher
第一步骤:
首先新建一个工程,默认就一个Activity 就是MainActivity
在AndroidManifest.xml的MainActivity节点下新添加
<category android:name="android.intent.category.HOME" />
第二步骤:
主界面只有一个 GridView
<pre name="code" class="html"><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="${relativePackage}.${activityClass}" >
<GridView
android:id="@+id/apps_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="4" >
</GridView>
</RelativeLayout>
第三步骤:
定义每一个app的界面,app只显示icon和name
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="30dp"
android:orientation="vertical" >
<ImageView
android:id="@+id/app_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
</ImageView>
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
</TextView>
</LinearLayout>
第四步骤:
定义GridView的适配器
public class AppAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater inflater;
ArrayList<ResolveInfo> appList;
public final class AppItem {
public ImageView appIcon;
public TextView appName;
}
public AppAdapter(Context context, List<ResolveInfo> apps) {
mContext = context;
inflater = LayoutInflater.from(mContext);
appList = (ArrayList<ResolveInfo>)apps;
}
@Override
public int getCount() {
return appList.size();
}
@Override
public Object getItem(int position) {
return appList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
AppItem appItem = null;
if(convertView == null)
{
convertView = inflater.inflate(R.layout.app_item, null);
appItem = new AppItem();
appItem.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
appItem.appName = (TextView) convertView.findViewById(R.id.app_name);
convertView.setTag(appItem);
} else {
appItem = (AppItem) convertView.getTag();
}
<span style="color:#990000;">ResolveInfo info = appList.get(position); </span>
appItem.appIcon.setImageDrawable<span style="color:#cc0000;">(info.loadIcon(mContext.getPackageManager())</span>);
appItem.appName.setText(<span style="color:#cc0000;">info.loadLabel(mContext.getPackageManager())</span>);
return convertView;
}
}
通过 ResolveInfo 获取具体信息方法:
包名获取方法:resolve.activityInfo.packageName
icon获取获取方法:resolve.loadIcon(packageManager)
应用名称获取方法:resolve.loadLabel(packageManager).toString()
第五步骤:
主界面代码:
public class MainActivity extends Activity {
private GridView appsGridView;
private List<ResolveInfo> appList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
appsGridView = (GridView) findViewById(R.id.apps_list);
//获取app列表
appList = getAppList();
appsGridView.setAdapter(new AppAdapter(MainActivity.this, appList));
appsGridView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ResolveInfo info = appList.get(position);
openAppLication(info);
}
});
}
//获取APP列表
private List<ResolveInfo> getAppList(){
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
return getPackageManager().queryIntentActivities(mainIntent, 0);
}
//打开App
private void openAppLication(ResolveInfo info){
//该应用的包名
String pkg = info.activityInfo.packageName;
//应用的主activity类(MAIN)
String cls = info.activityInfo.name;
//ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的。
ComponentName componet = new ComponentName(pkg, cls);
Intent intent = new Intent();
intent.setComponent(componet);
startActivity(intent);
}
}
获取app列表
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
getPackageManager().queryIntentActivities(mainIntent, 0);
//该应用的包名
String pkg = info.activityInfo.packageName;
//应用的主activity类(MAIN)
String cls = info.activityInfo.name;
//ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的。
ComponentName componet = new ComponentName(pkg, cls);
Intent intent = new Intent();
intent.setComponent(componet);
startActivity(intent);