最近在為公司做一款車聯網的產品,由於公司本身擅長於汽車解碼器的研發,所以該產品的診斷功能的實現除了使用目前市面上車聯網產品中大量使用的OBD協議外,還會使用一些專車專用協議去實現一些特殊的診斷功能,如升窗降窗、保養歸零、讀TPMS數據流等。公司的想法是把這些專車專用的診斷當成一種付費服務提供給用戶,即用戶在免費使用基於OBD協議實現的診斷功能外,若想使用專車專用協議實現的某個特殊功能則需要按每個功能多少錢的形式付費(本人不太贊成靠這種方式賺錢,覺得還是免費的好)。
我主要負責這款車聯網產品中Android APP的開發,對於實現前面所提及的這個產品需求,我們准備把每款車的特殊功能診斷程序做成一個個的子程序,即一個個的子APK,之所以選擇這樣的一種方式,原因在於:①當前市面上車型很多,每個車型對應的同一個特殊功能的診斷程序因汽車協議不同而不一樣,若全部程序都放在一個APP中,勢必會造成APP過大,后期也不好維護;②提供這些特殊功能的初衷是為了迎合專業的汽車維修人員和車輛改裝發燒友(以下稱為“專業用戶”)的需求,很可能大部分普通用戶都不會去使用,這樣能更方便需要的用戶下載。
為了在用戶安裝了子APK之后不至於讓用戶的桌面全是各種圖標(本人很討厭手機桌面太亂),體驗太差且讓程序的入口還能集中在主APK,只能想辦法使用一些小技巧在桌面不顯示這些圖標。具體實現方式如下:
1、開發一個名為OpenNoIconAPP.apk的主APP,里面就一個按鈕用於點擊后打開子APP,核心跳轉代碼如下:
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;
}
}
2、開發名為NoIconAPP.apk的子APP(用於主APP去打開),該APP主要實現在桌面不顯示圖標。其中要想不顯示桌面圖標只需修改AndroidManifest.xml文件即可。具體如下:
<?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>
3、上面的設置可以讓桌面圖標不顯示的原因:
一般情況下,當我們的APK在被安裝后,系統會自動創建我們的APK程序,系統Launcher(系統桌面應用程序)會自動檢測系統已經安裝的應用軟件的包名,然后把這些APP的圖標和名稱解析出來后顯示在應用程序列表里,一旦我們像上面那樣設置不顯示APK圖標,則APK程序在運行后只會顯示在“正在運行”的程序列表中,而不會在桌面上顯示圖標和名字。如果只是設置APP圖標不可見而使用第一種方式(我注釋的代碼)打開APP是不會成功的,因為這樣設置后,包名根本就沒有加載到Launcher,所以通過 getPackageManager().getLaunchIntentForPackage()方法得到的Intent為null。
4、其它舉例:
前幾天更新了聯通“手機應用廳”的最新版Android APP,發現新增加的“網絡測速”功能其實是一個子APP,使用的正是這種方式。
5、示例程序:
點擊下載。
