最近在为公司做一款车联网的产品,由于公司本身擅长于汽车解码器的研发,所以该产品的诊断功能的实现除了使用目前市面上车联网产品中大量使用的OBD协议外,还会使用一些专车专用协议去实现一些特殊的诊断功能,如升窗降窗、保养归零、读TPMS数据流等。公司的想法是把这些专车专用的诊断当成一种付费服务提供给用户,即用户在免费使用基于OBD协议实现的诊断功能外,若想使用专车专用协议实现的某个特殊功能则需要按每个功能多少钱的形式付费(本人不太赞成靠这种方式赚钱,觉得还是免费的好)。
我主要负责这款车联网产品中Android APP的开发,对于实现前面所提及的这个产品需求,我们准备把每款车的特殊功能诊断程序做成一个个的子程序,即一个个的子APK,之所以选择这样的一种方式,原因在于:①当前市面上车型很多,每个车型对应的同一个特殊功能的诊断程序因汽车协议不同而不一样,若全部程序都放在一个APP中,势必会造成APP过大,后期也不好维护;②提供这些特殊功能的初衷是为了迎合专业的汽车维修人员和车辆改装发烧友(以下称为“专业用户”)的需求,很可能大部分普通用户都不会去使用,这样能更方便需要的用户下载。
为了在用户安装了子APK之后不至于让用户的桌面全是各种图标(本人很讨厌手机桌面太乱),体验太差且让程序的入口还能集中在主APK,只能想办法使用一些小技巧在桌面不显示这些图标。具体实现方式如下:
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_open_app:
/*
* Intent intent = getPackageManager().getLaunchIntentForPackage(
* "com.example.noicontest"); if (intent != null) { //
* startActivity(intent); } else {
* Toast.makeText(getApplicationContext(), "没有该子APP,请下载安装",
* Toast.LENGTH_LONG).show(); }
*/
Intent intent = new Intent();
ComponentName cn = new ComponentName("com.example.noiconapp","com.example.noiconapp.MainActivity");
intent.setComponent(cn);
intent.setAction("android.intent.action.MAIN");
try {
startActivityForResult(intent, RESULT_OK);
} catch (Exception e) {
Toast.makeText(this, "没有该子APP,请下载安装",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.noiconapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.noiconapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- 要想在桌面不显示图标,只需注释掉APP入口Activity中的下面这句即可,或者把下面的LAUNCHER改成DEFAULT也行 -->
<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
</intent-filter>
</activity>
</application>
</manifest>
一般情况下,当我们的APK在被安装后,系统会自动创建我们的APK程序,系统Launcher(系统桌面应用程序)会自动检测系统已经安装的应用软件的包名,然后把这些APP的图标和名称解析出来后显示在应用程序列表里,一旦我们像上面那样设置不显示APK图标,则APK程序在运行后只会显示在“正在运行”的程序列表中,而不会在桌面上显示图标和名字。如果只是设置APP图标不可见而使用第一种方式(我注释的代码)打开APP是不会成功的,因为这样设置后,包名根本就没有加载到Launcher,所以通过 getPackageManager().getLaunchIntentForPackage()方法得到的Intent为null。
前几天更新了联通“手机应用厅”的最新版Android APP,发现新增加的“网络测速”功能其实是一个子APP,使用的正是这种方式。
点击下载。