AndroidはButterKnifeと組み合わせて独自のBaseActivityを作成(6.0対応)


Androidの開発では、アプリ内のすべてのactivityを統一的に操作するためにBaseActivityを作成する必要があります.今日はButterKnifeと組み合わせて強化版のBaseActivityを作る方法についてお話しします.ButterKnifeに詳しくない方は、私のこの文章AndroidのButterKnifeの使い方を参考にして詳しく説明してください.
BaseActivity
public abstract class BaseActivity extends AppCompatActivity {


    private Unbinder mUnbinder;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentViewResId());
        mUnbinder = ButterKnife.bind(this);

        init(savedInstanceState);
    }

    public abstract int getContentViewResId();

    public abstract void init(Bundle savedInstanceState);

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mUnbinder.unbind();
    }

}

我々のButterKnifeの各Activityにおけるバインドとデバインド操作は同じであるため,BaseActivity抽象クラスにカプセル化した.私たちの使用を見てみましょう.
public class TestActivity extends BaseActivity {
    @BindView(R.id.tv_test)
    TextView mTextView;

    @Override
    public int getContentViewResId() {
        //      Activity contentViewId
        return R.layout.activity_test;
    }

    @Override
    public void init(Bundle savedInstanceState) {
        //          
    }
}

ButterKnifeが入っているかどうかは、とても便利です
次はBaseFragmentを見てみましょう

public abstract class BaseFragment extends Fragment {

    public static final String TAG = BaseFragment.class.getSimpleName();
    private View mRootView;
    private Unbinder mUnbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mRootView = inflater.inflate(getLayoutResId(), container, false);
        mUnbinder = ButterKnife.bind(this, mRootView);
        init(savedInstanceState);
        return mRootView;
    }

    public abstract void init(Bundle savedInstanceState);

    public abstract int getLayoutResId();

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mUnbinder.unbind();
    }
}

実はBaseActivityとBaseFragmentの差は大きくなく、ButterKnifeで初期化に必要なのは少し違います.ここではあまり述べない.次に、究極版の6.0パーミッション操作に対応するBaseActivityについて説明します.
究極版6.0ランタイム権限対応BaseActivity

public abstract class BaseActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback {


    private Unbinder mUnbinder;


    /**
     *            
     */
    protected String[] mNeedPermissions = {
            //            
            //  :  sd 
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
    };


    private static final int PERMISSION_REQUEST_CODE = 0;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentViewResId());
        mUnbinder = ButterKnife.bind(this);

        checkPermissions(mNeedPermissions);
        init(savedInstanceState);
    }

    /**
     * @param permissions
     */
    private void checkPermissions(String... permissions) {
        List needRequestPermissionList = findDeniedPermissions(permissions);
        if (null != needRequestPermissionList
                && needRequestPermissionList.size() > 0) {
            ActivityCompat.requestPermissions(this,
                    needRequestPermissionList.toArray(
                            new String[needRequestPermissionList.size()]),
                    PERMISSION_REQUEST_CODE);
        }
    }


    /**
     *                
     *
     * @param permissions
     * @return
     */
    private List findDeniedPermissions(String[] permissions) {
        List needRequestPermissionList = new ArrayList();
        for (String perm : permissions) {
            if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED
                    || ActivityCompat.shouldShowRequestPermissionRationale(this, perm)) {
                needRequestPermissionList.add(perm);
            }
        }
        return needRequestPermissionList;
    }


    /**
     *               
     *
     * @param grantResults
     * @return
     */
    private boolean verifyPermissions(int[] grantResults) {
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }


    /**
     *       
     *
     */
    private void showMissingPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.notifyTitle);
        builder.setMessage(R.string.notifyMsg);

        //   ,     
        builder.setNegativeButton(R.string.cancel,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });

        builder.setPositiveButton(R.string.setting,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startAppSettings();
                    }
                });

        builder.setCancelable(false);

        builder.show();
    }


    /**
     *        
     *
     */
    private void startAppSettings() {
        Intent intent = new Intent(
                Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivity(intent);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (!verifyPermissions(grantResults)) {
                showMissingPermissionDialog();
            }
        }
    }

    public abstract int getContentViewResId();

    public abstract void init(Bundle savedInstanceState);

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mUnbinder.unbind();
    }

}

コードを説明します:1.まず、onCreatecheckPermissions(mNeedPermissions)を通じて必要な権限をチェックし、checkPermissionsfindDeniedPermissionsを呼び出して申請する必要がある権限を探し、ActivityCompat.requestPermissionsを呼び出して申請権限を呼び出します.申請権限はonRequestPermissionsResultで戻り、verifyPermissionsを呼び出してすべての権限が許可されているかどうかを確認します.showMissingPermissionDialogが呼び出されなければ、ユーザ権限が確実であることを通知する.最後に、BaseActivityを継承し、mNeedPermissionsというメンバー変数を書き換えるだけで使用できます.申請権限が必要なActivityに膨大なコードを書く必要はありません.BaseFragmentはBaseActivityと同じですよ!