分类 安卓开发 下的文章

安卓开发时的突发奇想

在新的 Android N 版本中,ConnectivityManager 的 API 发生了较大变化,特别是在移动数据方面新增了“流量节省模式”(Data Saver)。这里要注意,它并不是 Chrome 里通过 Google 服务器代理的流量压缩功能(该功能在国内无法使用)。
用户可以在设置 > 流量使用情况中启用或禁用 Data Saver。默认情况下,后台数据是允许的,但启用后,系统会提供一个应用列表,用户可以手动选择哪些应用不受流量限制。如果想要彻底关闭某个应用的后台数据,也可以在流量使用情况中手动开关后台数据权限。
今天我们主要讨论 InWall 环境 下,开启 Data Saver 后后台流量和推送消息的处理方式。
当 Data Saver 开启且后台数据被禁用时,应用在后台将无法访问网络。这种情况下,我们需要在应用启动时请求用户允许后台数据访问。为此,可以使用 Intent 跳转到相应的系统设置页面,并传入应用的 packageName,让用户手动调整设置:

try {
    Intent intent = new Intent(Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS);
    Uri uri = Uri.parse("package:com.napidemo.datasaver");
    intent.setData(uri);
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    Log.e("SettingsRedirect", "Can't Open Settings", e);
    Toast.makeText(this, "Can't Open Settings", Toast.LENGTH_SHORT).show();
}

写接收器来监听流量节省开关事件。以下是我的代码。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.util.Log;

public class NetworkChangeReceiver extends BroadcastReceiver {
    private static final String TAG = "NetworkReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null || intent.getAction() == null) {
            return;
        }

        Log.d(TAG, "Received broadcast: " + intent.getAction());

        ConnectivityManager connectivityManager = 
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (connectivityManager == null) {
            Log.w(TAG, "ConnectivityManager is null");
            return;
        }

        boolean isMetered = connectivityManager.isActiveNetworkMetered();
        Log.d(TAG, "Network metered: " + isMetered);

        if (isMetered) {
            int restrictStatus = connectivityManager.getRestrictBackgroundStatus();
            Log.d(TAG, "Restrict background status: " + restrictStatus);

            switch (restrictStatus) {
                case ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED:
                    Log.d(TAG, "Background data is not restricted.");
                    break;
                case ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED:
                    Log.d(TAG, "Background data is restricted.");
                    break;
                case ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED:
                    Log.d(TAG, "App is whitelisted for background data.");
                    break;
                default:
                    Log.w(TAG, "Unknown restrict background status.");
                    break;
            }
        }
    }
}

再注册一下接收器

private final DataSaverReceiver dataSaverReceiver = new DataSaverReceiver();

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(dataSaverReceiver, new IntentFilter(ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED));
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(dataSaverReceiver);
}

自己尝试了下,,觉得如果利用好,这个API在国内一样能有大用处,不过。。。某些国内主流软件还在使用4.0的API(不不不,我不是针对各大Bank),普及起来,难度很大啊!

本文恢复自本站2016年11月7日时的备份,仅供阅读本人黑历史之用,其中的资料或链接可能已过时或失效,敬请见谅

版本辨别:
1.AOSP/EMUI等采用的com.google.webview
最新版本:54
可以经由Play直接升级
2.CM/MK/Silm等所采用的com.android.webview
最新版本:51
以下讲讲如何升级再编译版的Webview
这个Webview许多OS自带的版本仅仅只有42,html5低的很,但是由于是重编译版,so。。。更新速度感人!
CM的WebviewGituhub站:GitHub/CMWebview
下载时记得选对指令集:)
如果你硬要让使用重编译的webview框架使用Google版,请使用:强行Google Webview
但是请注意!千万不要使用幸运破解器的整合系统更新!重启后会导致几乎所有调用Webview的APP全局go die!千万不要大死!