最近在爲公司作一款車聯網的產品,因爲公司自己擅長於汽車解碼器的研發,因此該產品的診斷功能的實現除了使用目前市面上車聯網產品中大量使用的OBD協議外,還會使用一些專車專用協議去實現一些特殊的診斷功能,如升窗降窗、保養歸零、讀TPMS數據流等。公司的想法是把這些專車專用的診斷當成一種付費服務提供給用戶,即用戶在無償使用基於OBD協議實現的診斷功能外,若想使用專車專用協議實現的某個特殊功能則須要按每一個功能多少錢的形式付費(本人不太同意靠這種方式賺錢,以爲仍是免費的好)。android
我主要負責這款車聯網產品中Android APP的開發,對於實現前面所說起的這個產品需求,咱們準備把每款車的特殊功能診斷程序作成一個個的子程序,即一個個的子APK,之因此選擇這樣的一種方式,緣由在於:①當前市面上車型不少,每一個車型對應的同一個特殊功能的診斷程序因汽車協議不一樣而不同,若所有程序都放在一個APP中,勢必會形成APP過大,後期也很差維護;②提供這些特殊功能的初衷是爲了迎合專業的汽車維修人員和車輛改裝發燒友(如下稱爲「專業用戶」)的需求,極可能大部分普通用戶都不會去使用,這樣能更方便須要的用戶下載。網絡
爲了在用戶安裝了子APK以後不至於讓用戶的桌面全是各類圖標(本人很討厭手機桌面太亂),體驗太差且讓程序的入口還能集中在主APK,只能想辦法使用一些小技巧在桌面不顯示這些圖標。具體實現方式以下: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; } }
<?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。this
前幾天更新了聯通「手機應用廳」的最新版Android APP,發現新增長的「網絡測速」功能實際上是一個子APP,使用的正是這種方式。code
點擊下載。xml