Android踩过的坑

一、版本升级

// 8.0以上系统调用安装应用
public void startInstallApk(String apkName) {
    if (Build.VERSION.SDK_INT >= 26) {
        boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
        if (!hasInstallPermission) {
            //注意这个是8.0新API
            Uri packageURI = Uri.parse("package:" + getPackageName());
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
            startActivityForResult(intent, 10025);
        }
        else {
            installApk(apkName);
        }
    }
    else {
        installApk(apkName);
    }
}

// 8.0以下系统安装应用
public void installApk(String apkName) {
    FileUtils mFileUtils = new FileUtils();
    Uri mUri;
    Intent intent = new Intent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setAction(Intent.ACTION_VIEW);
    //7.0系统开始认为直接使用本地Uri是不安全的 所以以FileProvider共享给外部提高安全性
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        mUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + BuildConfig.ProviderSuffix, mFileUtils.getApksFile(apkName));
    } else {
        mUri = Uri.fromFile(mFileUtils.getApksFile(shortCutName));
    }
    //添加这一句表示对目标应用临时授权该Uri所代表的文件
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setDataAndType(mUri,
            "application/vnd.android.package-archive");
    startActivity(intent);
}

二、获取mac地址

// 获取外网Mac地址
public static String getConnectingWifiMac(Context context) {
    WifiManager wm = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    WifiInfo info = wm.getConnectionInfo();
    String mac = info.getBSSID();
    if (mac == null || mac.equals("02:00:00:00:00:00")) {
        mac = getMacAddr();
    }
    return mac;
}

private static String getMacAddr() {
    try {
        List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface nif : all) {
            if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
            byte[] macBytes = nif.getHardwareAddress();
            if (macBytes == null) {
                return "";
            }
            StringBuilder res1 = new StringBuilder();
            for (byte b : macBytes) {
                res1.append(String.format("%02X:",b));
            }
            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {
    }
    return "02:00:00:00:00:00";
}

Android 6.0以后用WifiManager获取的mac地址都是02:00:00:00:00:00, 因此需要用下面一种方法获取, 但是最近新出来的Android8.1系统要想获取到外网mac地址,必须打开GPS,否则获取出来是手机本地的mac地址

三、应用被释放后回来一片白

@Override
protected void onCreate(Bundle savedInstanceState) {

    if (savedInstanceState != null) {
        finish();
        Intent intent = new Intent(this, LauncherActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
    }

}

应用被释放以后回来力图恢复,但是由于复杂的环境经常会出现空指针,所以当程序被释放后最简单的方式就是重新打开启动页面从头开始

四、被释放后空指针问题

程序被释放后经常出现乱七八糟的问题,即使使用了上面的方案还是难免会出现空指针之类的问题,那是因为在Application里面声明了很多变量,给变量赋值以后在程序里面直接从Application里去拿,当应用被释放以后Application里面的数据都为空了,当程序重启的时候Application并没有重启, 所以第三点问题没有彻底解决,因此我们平时应用里面需要的变量要放到BaseActivity里或者BaseFragment里面,不能放到Application里。

猜你喜欢

转载自blog.csdn.net/helloworld19870427/article/details/83825301