隨著市面上越來越多三方APP的出現,某些手機廠商也開始對這些APP進行了安裝限制或者運行限制,或者三方APP自身的版本過低,無法被特定的系統版本所支持,
今天我將要模擬實作一個“由于APP自身版本過低、導致無法在當前的系統版本上運行”的功能效果,
實作思路如下:
-
要獲得APP的目標運行版本,也要知道系統的編譯版本
-
通過版本比較,在進入該APP時,給用戶做出“不支持運行”的提示
-
用戶確認提示后,直接退出該APP
關鍵點是 targetSdkVersion 的使用,原始碼如下:
1、主Activity
public class TargetSdkVersionDemo extends Activity {
@Override
protected void onCreate(Bundle onSavedInstance) {
super.onCreate(onSavedInstance);
setContentView(R.layout.target_sdk_version_demo);
int appTargetSdkVersion = getApplicationInfo().targetSdkVersion;
Log.i("TargetSdkVersionDemo", "targetsdkversion " + appTargetSdkVersion);
// 我們假設這個APP的目標運行版本不高于 API Level 26
if (appTargetSdkVersion <= Build.VERSION_CODES.O) {
showNotSupportDialog(appTargetSdkVersion);
}
}
private void showNotSupportDialog(int version) {
new AlertDialog.Builder(this)
.setMessage("該APP的目標運行版本是 " + version + ",低于手機當前的版本,不支持運行!")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 退出程式
finish();
}
})
.create()
.show();
}
}
2、在AndroidManifest.xml中需要定義 uses-sdk 這個標簽的 targetSdkVersion 屬性:
<uses-sdk android:targetSdkVersion="25" />
注意:
如果在 app 目錄下的 build.gradle 檔案中定義了 targetSdkVersion,則會覆寫 AndroidManifest中的值,原始碼中有說明:

3、效果圖如下:

我們注意到程式中使用的是 getApplicationInfo().targetSdkVersion,說明這個變數是 ApplicationInfo.java 的成員變數,這個值是在安裝APK的程序中、由系統服務 PackageManagerService 決議賦值的,決議的原始碼位于 frameworks\base\core\java\android\content\pm\PackageParser.java 中:

可以看到:
-
先決議 TAG_USES_SDK(uses-sdk)
-
再決議屬性名 targetSdkVersion 以及 minSdkVersion 的值
最后再賦值給 applicationInfo物件的:
pkg.applicationInfo.targetSdkVersion = targetSdkVersion
本文由博客群發一文多發等運營工具平臺 OpenWrite 發布
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/255119.html
標籤:Android
