自己封装的BaseActivity 有不足之处 请多多指点
采用了静态类继承AppCompatActivity(当然也可以继承Activity),主要对onCreate() 方法做了优化,简化子类
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseActivity extends AppCompatActivity {
private static String TAG = "";
/**
* 设置布局页面
*
* @return
*/
protected abstract int setLayout();
/**
* 设置所需要的 动态请求的权限,可设置多个
*/
protected abstract String[] setNeedPermissions();
/**
* 设置 findViewById
*/
protected abstract void initView();
/**
* 读取保存的实例
*
* @param savedInstanceState
*/
protected abstract void readSavedInstanceState(Bundle savedInstanceState);
/**
* 初始化页面
*/
protected abstract void startView();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(setLayout());
initView();
readSavedInstanceState(savedInstanceState);
TAG = getClass().getName();
//用来查看打开的是哪个Activity
Log.w("current activity: ", this.getClass().getSimpleName());
startView();
}
@Override
public void finish() {
super.finish();
}
//============================================== 动态权限申请模块 =====================================
@Override
protected void onResume() {
super.onResume();
if (isNeedCheck) {
checkPermissions(needPermissions);
}
}
/**
* 判断是否需要检测,防止不停的弹框
*/
private boolean isNeedCheck = true;
/**
* 需要进行检测的权限数组
* <p>
* Manifest.permission.ACCESS_COARSE_LOCATION,
* Manifest.permission.ACCESS_FINE_LOCATION,
* Manifest.permission.WRITE_EXTERNAL_STORAGE,
* Manifest.permission.READ_EXTERNAL_STORAGE,
* Manifest.permission.READ_PHONE_STATE,
* Manifest.permission.CAMERA
*/
protected String[] needPermissions = setNeedPermissions();
private static final int PERMISSON_REQUESTCODE = 0;
/**
* @param
* @since 2.5.0
* requestPermissions方法是请求某一权限,
*/
private void checkPermissions(String... permissions) {
List<String> needRequestPermissonList = findDeniedPermissions(permissions);
if (null != needRequestPermissonList
&& needRequestPermissonList.size() > 0) {
ActivityCompat.requestPermissions(this,
needRequestPermissonList.toArray(
new String[needRequestPermissonList.size()]),
PERMISSON_REQUESTCODE);
}
}
/**
* 获取权限集中需要申请权限的列表
*
* @param permissions
* @return
* @since 2.5.0
* checkSelfPermission方法是在用来判断是否app已经获取到某一个权限
* shouldShowRequestPermissionRationale方法用来判断是否
* 显示申请权限对话框,如果同意了或者不在询问则返回false
*/
private List<String> findDeniedPermissions(String[] permissions) {
if (permissions == null || permissions.length <= 0) return null;
List<String> needRequestPermissonList = new ArrayList<String>();
for (String perm : permissions) {
if (ContextCompat.checkSelfPermission(this,
perm) != PackageManager.PERMISSION_GRANTED) {
needRequestPermissonList.add(perm);
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this, perm)) {
needRequestPermissonList.add(perm);
}
}
}
return needRequestPermissonList;
}
/**
* 检测是否所有的权限都已经授权
*
* @param grantResults
* @return
* @since 2.5.0
*/
private boolean verifyPermissions(int[] grantResults) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 申请权限结果的回调方法
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] paramArrayOfInt) {
if (requestCode == PERMISSON_REQUESTCODE) {
if (!verifyPermissions(paramArrayOfInt)) {
showMissingPermissionDialog();
isNeedCheck = false;
}
}
}
/**
* 显示提示信息
*
* @since 2.5.0
*/
private void showMissingPermissionDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("当前应用缺少必要权限。请点击\"设置\"-\"权限\"-打开所需权限。")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
BaseActivity.this.finish();
}
}).create();
dialog.show();
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(this, R.color.colorAccent));
dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(this, R.color.colorGrey5));
}
/**
* 启动应用的设置
*
* @since 2.5.0
*/
private void startAppSettings() {
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
//=================================================== 控制 View 显示隐藏 =======================================
/**
* 判断View是否存在
* 不存在返回true 存在返回false
*
* @param view 需要判断的View
* @return
*/
private boolean isViewExist(View view) {
if (view == null) {
Log.i(TAG, "view 不存在 请检查是否 findViewById ");
return true;
} else {
return false;
}
}
/**
* 显示View
*
* @param view
*/
protected void visibleView(View view) {
if (isViewExist(view)) return;
if (view.getVisibility() != View.VISIBLE) {
view.setVisibility(View.VISIBLE);
}
}
/**
* 隐藏View
*
* @param view
*/
protected void goneView(View view) {
if (isViewExist(view)) return;
if (view.getVisibility() != View.GONE) {
view.setVisibility(View.GONE);
}
}
/**
* 隐藏View 但是view占用的空间不会隐藏
*
* @param view
*/
protected void invisibleView(View view) {
if (isViewExist(view)) return;
if (view.getVisibility() != View.INVISIBLE) {
view.setVisibility(View.INVISIBLE);
}
}
//================================ TextView EditText 赋值 ===============================
protected void setTextViewText(TextView view, String value) {
if (isViewExist(view)) return;
view.setText(value);
}
protected void setTextViewText(TextView view, int value) {
if (isViewExist(view)) return;
String valuestr = getResources().getString(value);
if (StringUtils.isNullOrEmpty(valuestr))return;
view.setText(valuestr);
}
protected void setEditText(int viewId, String text) {
if (StringUtils.isNullOrEmpty(text)) return;
View view = findViewById(viewId);
if (isViewExist(view)) return;
EditText editText;
if (view instanceof EditText){
editText = (EditText) view;
editText.setText(text);
return;
}
Log.i(TAG, view + "不是EditText 不能赋值 ");
return;
}
protected void setEditText(int viewId, int text) {
View view = findViewById(viewId);
if (isViewExist(view)) return;
EditText editText;
if (view instanceof EditText){
editText = (EditText) view;
String valuestr = getResources().getString(text);
if (StringUtils.isNullOrEmpty(valuestr))return;
editText.setText(valuestr);
return;
}
Log.i(TAG, view + "不是EditText 不能赋值 ");
return;
}
protected void setTextViewText(int viewId, String text) {
if (StringUtils.isNullOrEmpty(text)) return;
View view = findViewById(viewId);
if (isViewExist(view)) return;
TextView editText;
if (view instanceof TextView){
editText = (TextView) view;
editText.setText(text);
return;
}
Log.i(TAG, view + "不是EditText 不能赋值 ");
return;
}
protected void setTextViewText(int viewId, int text) {
View view = findViewById(viewId);
if (isViewExist(view)) return;
TextView editText;
if (view instanceof TextView){
editText = (TextView) view;
editText.setText(text);
return;
}
Log.i(TAG, view + "不是EditText 不能赋值 ");
return;
}
/**
*
* @param value
*/
protected void setTextViewText(int viewId, String value,String defaultValue) {
if (StringUtils.hasContent(value)) {
setTextViewText(viewId,value);
return;
}
setTextViewText(viewId,defaultValue);
}
//================================= TextView EditText 取值 =========================
/**
* @param viewId 要取值的控件Id
* @return 取出的值
*/
protected String getEditText(int viewId){
EditText editText = (EditText) findViewById(viewId);
if (editText == null) return "";
return editText.getText().toString();
}
/**
*
* @param viewId 要取值的控件Id
* @return 取出的值
*/
protected String getTextViewText(int viewId){
TextView editText = (TextView) findViewById(viewId);
if (editText == null) return "";
return editText.getText().toString();
}
}
已经封装好了,附带一个子类实例
public class StartActivity extends BaseActivity {
/**
* 设置布局
*/
@Override
protected int setLayout() {
return R.layout.activity_start;
}
/**
* 动态申请的权限数组
* 这里申请了 定位和读写权限
* return null 时不申请
*/
@Override
protected String[] setNeedPermissions() {
return new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE};
}
/**
* 初始化控件 findViewById
*/
@Override
protected void initView() {
}
/**
* 读取上个Activity传的值和保存的实例
*/
@Override
protected void readSavedInstanceState(Bundle savedInstanceState) {
if(savedInstanceState == null){ // 为空时从 getIntent()里取值
getIntent().getStringExtra("key");
}else { //从实例中取值
savedInstanceState.getString("key");
}
}
/**
* 初始化View
*/
@Override
protected void startView() {
}
/**
* 储存实例
* @param outState
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.getString("key","value");
super.onSaveInstanceState(outState);
}
}
本人新手,这只是自己工作中使用到的,算是一个总结,肯定有不足的地方,请大家多指点