主要更新模块
- 电源管理
- 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);
}
}