android6.0新特性

主要更新模块

  • 电源管理
  • App Link
  • 指纹识别
  • 应用权限管理(最重要)

电源管理
App Standby(应用待机)
检测:当设备不充电,且在这时间内用户没有直接或间接的启动该应用
退出:当应用被激活时,或者设备充电时,系统将应用移出此状态。
Doze
检测:当设备不充电,且当设备静止且灭屏一段时间。
周期:平台尝试让系统处于休眠状态,周期性的进入在一个维持窗口恢复正常操作,然后进入更长的休眠状态。

App Link
* 全称为应用程序链接
* 技术点:就是我们的隐式启动Intent
* android更加鼓励应用程序间的关联而不再是单一的应用同浏览器的交互

指纹识别
6.0以前一直由各手机制造厂商去研发。导致指纹识别不同的手机差异巨大
6.0以后由android系统提供API,硬件厂商只需要提供相应的硬件支持即可

应用程序权限管理
5.0以前,只需要manifest.xml中注册申明即可
5.0以后,用户可以在安装的时候关闭某些权限
6.0及以后,对于一些用户隐私权限总是会在第一次提示用户是否授予权限(和Iphone类似)

运行时权限的优势
新的权限机制更好的保护了用户的隐私
给了程序向用户说明权限的作用
可以防止一些恶意程序盗取用户或者手机信息,增强了android系统的安全性
权限组的概念
如果你申请某个危险的权限,假如你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。

新增API
检测当前app是否拥有某个权限
ContextCompact.checkSelfPermission

如果没有权限就会执行该方法申请权限
ActivityCompat.requestPermission()

申请权限是一个异步的过程,会执行下面的回调函数返回结果
onRequestPermissionsResult()

给用户解释权限到底用来干什么的,在用户拒绝时才会提示
ActivityCompat.shouldShowRequestPermissionRationale

使用流程
在AndroidManifest中添加需要的权限(不可省)
检查权限
申请授权

代码实战
通过代码来实现适配我们新的权限管理机制

封装BaseActivity权限管理

import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
    }

    //为子类提供一个权限检查方法
    public boolean hasPermission(String... permissions){
        for (String permission : permissions){
            if (ContextCompat.checkSelfPermission(this,permission)!= PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    public void requestPermission(int code,String... permissions){
        ActivityCompat.requestPermissions(this,permissions,code);

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case Constants.WRITE_EXTERNAL_CODE:
                //读写权限回调处理
                if (grantResults[0]==PackageManager.PERMISSION_GRANTED) {
                    doSDCardPermission();
                }else {
                    //提示用户权限未被授予
                }
                break;
            case Constants.CALL_PHONE_CODE:
                //打电话权限回调处理
                if (grantResults[0]==PackageManager.PERMISSION_GRANTED) {
                    doCallPhone();
                }else {
                    //提示用户权限未被授予
                }
                break;
        }
    }

    /**
     * 默认的打电话权限处理
     */
    public void doCallPhone() {

    }

    /**
     * 默认的写SD权限处理
     */
    public void doSDCardPermission() {

    }

}

子类Activity实现

public class PremissionActivity extends BaseActivity {
    private Button mCallView;
    private Button mFileDownloadView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_premission);
        mCallView = obtainView(R.id.login_view);
        mFileDownloadView = obtainView(R.id.down_load_file);
        mCallView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (hasPermission(Manifest.permission.CALL_PHONE)){
                    doCallPhone();
                }else {
                    requestPermission(Constants.CALL_PHONE_CODE,Manifest.permission.CALL_PHONE);
                }
            }
        });
        mFileDownloadView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                    doSDCardPermission();
                }else {
                    requestPermission(Constants.WRITE_EXTERNAL_CODE,Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
            }
        });
    }

    @Override
    public void doCallPhone(){
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:"+"10086");
        intent.setData(data);
        startActivity(intent);

    }

    @Override
    public void doSDCardPermission(){
    }

    public <T extends View> T obtainView(int id){
        return (T)findViewById(id);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值