Android 基于BaseActivity封装

`Android`优雅的封装`ActivityResultLauncher`启动活动和请求权限,外加处理意外被`kill`情况 Android优雅的封装ActivityResultLauncher启动活动和请求权限 一般我们在请求权限或者处理Activity返回结果的时候都会使用Activity#onActivityResult()和Activity#onRequestPermissionResult()这俩个方法,如今谷歌已经提供了新的请求方法:https://developer.android.com/training/permissions/requesting?hl=zh-cn。 这篇文章是解决什么的? 我想把每个处理结 阅读详情

1.前言

一般来说,BaseActivity是根据项目的业务逻辑和需求封装的,每个项目的业务逻辑不一样,肯定封装的也有所差异,以下就是我根据之前开发的项目总结了一些,经供参考:

public abstract class BaseActivity extends AppCompatActivity {
    private boolean isExit = false; // 是否退出按钮的转态标记
    protected Context mContext;
    protected final int DEFAULT_STATUS_BAR_ALPHA = 30;
    protected int page = 1;
    protected int count = 20;
    protected boolean canLoadmore = true;
    protected Unbinder mbinder;
    protected Toast toast = null;
    private static final String TAG = "BaseActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(getLayout());
        mContext = this;
        mbinder=ButterKnife.bind(this);
        initDate();
    }

    /**
     * 设置沉浸式标题栏 图片的
     */
    protected void setStatusBarTranslucent() {
        StatusBarUtil.setTranslucent(this, DEFAULT_STATUS_BAR_ALPHA);
    }

    /**
     * 设置沉浸式标题栏 标题栏的颜色
     */
    protected void setStatusBarColor(int color) {
       StatusBarUtil.setColor(this, ContextCompat.getColor(mContext, color),       DEFAULT_STATUS_BAR_ALPHA);
    }

    /**
     * 设置沉浸式标题栏 里面是Fragment
     */
    protected void setStatusBarColorInFragment() {
        StatusBarUtil.setTranslucentForImageViewInFragment(this, DEFAULT_STATUS_BAR_ALPHA, null);
    }
//    @Override
//    protected LinearLayout.LayoutParams generateTitleViewLayoutParams()
//    {
//        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, SDResourcesUtil.getDimensionPixelSize(R.dimen.height_title_bar));
//        return params;
//    }
    protected abstract int getLayout();

  //  protected abstract void initView(Bundle savedInstanceState);

    protected abstract void initDate();

    protected void showToast(String message) {
        if (!TextUtils.isEmpty(message)) {
            if (toast == null) {
                toast = Toast.makeText(mContext, message, Toast.LENGTH_SHORT);
            } else {
                toast.setText(message);
            }
            toast.show();
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
    }
    protected void openActivity(Class<?> pClass) {
        openActivity(pClass, null);
    }
    /**
     * 打开一个新的activity 之前的activity 都清除了
     *
     * @param pClass
     */
    protected void openActivityByNew(Class<?> pClass) {
        Intent i = new Intent(this, pClass);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
    }
    /**
     * 跳转页面
     *
     * @param pClass  跳转的页面
     * @param pBundle 传递过去的参数
     */
    protected void openActivity(Class<?> pClass, Bundle pBundle) {
        Intent intent = new Intent(this, pClass);
        if (pBundle != null) {
            intent.putExtras(pBundle);
        }
        startActivity(intent);
        // 动画效果
        // overridePendingTransition(R.anim.zoomin, R.anim.zoomout);
    }
    /**
     * 启动带结果的Activity
     *
     * @param pClass
     * @param pBundle
     * @param requestCode
     */
    protected void openActivityForResult(Class<?> pClass, Bundle pBundle, int requestCode) {
        Intent intent = new Intent(this, pClass);
        if (pBundle != null) {
            intent.putExtras(pBundle);
            startActivityForResult(intent, requestCode);
        } else {
            startActivityForResult(intent, requestCode);
        }
    }
    /** 
     * 关闭所有Activity 
     */  
    public static void finishAll() {  
        List<BaseActivity> copy;  
        synchronized (mActivities) {  
            copy = new ArrayList<BaseActivity>(mActivities);  
        }  
        for (BaseActivity activity : copy) {  
            activity.finish();  
        }  
    }  

    /** 
     * 关闭所有Activity,除了参数传递的Activity 
     */  
    public static void finishAll(BaseActivity except) {  
        List<BaseActivity> copy;  
        synchronized (mActivities) {  
            copy = new ArrayList<BaseActivity>(mActivities);  
        }  
        for (BaseActivity activity : copy) {  
            if (activity != except)  
                activity.finish();  
        }  
    } 
    /**
     * 双击退出程序
     */
    protected void exitBy2click() {
        Timer eExit = null;
        if (isExit == false) {
            isExit = true;
            Toast.makeText(BaseActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            eExit = new Timer();
            eExit.schedule(new TimerTask() {

                @Override
                public void run() {
                    isExit = false;
                }
            }, 2000);
        } else {
            finish();
            System.exit(0);
        }
    }

    public void finish() {
        super.finish();
        // 动画效果
        // overridePendingTransition(R.anim.zoomin, R.anim.zoomin);
    }

    public void defaultFinish() {
        super.finish();
    }


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

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
    }

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

    public static final int PERMISSION_REQUEST_CODE = 0x0001;
    public static PermissionListeren mLsteren = null;
    public static int REQUEST_CODE = 0;

    public static void requestPermission(int requestCode, PermissionListeren listeren, String... permission) {
        REQUEST_CODE = requestCode;
        List<String> permissionList = new ArrayList<>();
        Activity activity = ActivityManagerUtils.getInstance().getTopActivity();
        mLsteren = listeren;
        for (String s : permission) {
            if (ContextCompat.checkSelfPermission(activity, s) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(s);
            }
        }
        if (!permissionList.isEmpty()) {
            ActivityCompat.requestPermissions(activity, permissionList.toArray(new String[permissionList.size()]),
                    PERMISSION_REQUEST_CODE);
        } else {
            listeren.onGranted(REQUEST_CODE);
        }
    }
    /**
     * 请求权限
     */
    protected void requestPermissions(int code, String... permissions) {
        ActivityCompat.requestPermissions(this, permissions, code);
        SDToast.showToast("如果拒绝授权,会导致应用无法正常使用");
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0) {
                    List<String> permissionDenieds = new ArrayList<>();
                    List<String> noReminderPermissions = new ArrayList<>();
                    for (int i = 0; i < grantResults.length; i++) {
                        String permission = permissions[i];
                        if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                            permissionDenieds.add(permission);
                            if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
                                noReminderPermissions.add(permission);
                            }
                        }
                    }
                    if (!permissionDenieds.isEmpty()) {
                        mLsteren.onDenied(REQUEST_CODE, permissionDenieds, noReminderPermissions);
                    } else {
                        mLsteren.onGranted(REQUEST_CODE);
                    }
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                break;
        }
    }

    public interface PermissionListeren {

        //全部同意授权
        void onGranted(int requestCode);


        /**
         * 不同意授权
         *
         * @param deniedPermissions     未同意但是没有点不再提醒
         * @param noReminderPermissions 未同意并且点了不再提醒
         */
        void onDenied(int requestCode, List<String> deniedPermissions, List<String> noReminderPermissions);
    }
}

2.补充(上面沉浸式其他还有N多种方法,比如)

 public static void setStatusColor(Activity context, int color) {
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        SystemBarTintManager tintManager = new SystemBarTintManager(context);
        tintManager.setStatusBarTintColor(context.getResources().getColor(color));
        tintManager.setStatusBarTintEnabled(true);
        tintManager.setNavigationBarTintEnabled(false);
    }

3.今天的分享到这样哈,其实还有一些你们可以根据自己需要自己加上去,比如Toobar等等..

registerForActivityResult方法介绍以及封装,解决点击事件中无法调用问题 在API 29 之前的版本中,跳转 Activity 获取返回结果使用的是startActivityForResult 方法,而 startActivityForResult 方法在API 29 中废弃,为过时方法,而谷歌推出 registerForActivityResult 方法来替代。这种方式需要重写 onActivityResult 方法,然后判断 requestCode 和 resultCode 的方式处理回调,流程麻烦了一点且不合时宜。 阅读详情

相关推荐

Android BaseActivity App框架设计BaseActivity封装

Android BaseActivity 分享在Android开发中,为了更好的对栈堆中的Activity进行管理以及更有效的对程序中可复用的方法进行复用,我们通常会为程序写一个Activity的基类,这次我就分享一个Activity基类的基本写法。希望能够帮助到兄弟姐妹们。在开发的过程中,Activity通常会使用到FragmentActivity而FragmentActivity是继承Activ

ThomsonKang的博客 1405

Android 之路 (7) - 对BaseActivity的简单封装

引言 终于到了BaseActivity的封装了,在本章中将对通用性的一些方法和操作进行抽取,放到Base中。 正文 先起个名字,我们的Base就叫CandyBaseActivity吧,Candy是糖果的意思,我希望这一套东西能让人像吃糖果一样的甜! 分析 在本篇中关于Base,我们需要进行两种封装: CandyBaseActivity,最基本,最底层的Base,附带通用操作的封装。 Candy...

AndroidRookie 1919

如何使用AutoDl平台跑自己的模型(纯干货,步骤很详细)

记录我使用AutoDL云服务器来跑自己模型的全过程

qq_45073592的博客 3万+

封装Toolbar到BaseActivity

Android 5.0的时候Google用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar设置到Activity中。 一个应用的几乎所有界面都需要头部app bar,为了能够方便各个界面方便使用,统一管理,这里把toolBar封装到BaseActivity中。 1,定义一个toolbar_l...

thothsun 的博客 1849

IEEE Transactions模板中参考文献作者缩写、期刊名缩写

本文章记录如何在IEEE Transactions的模板中,解决参考文献的作者缩写、期刊名字缩写的问题。

weixin_43981621的博客 1万+

win2016 php mysql_Windows Server 2016 IIS10.0+PHP(FastCGI)+MySQL环境搭建教程 | 系统运维...

准备篇一、环境说明:操作系统:Windows Server 2016PHP版本:php 7.1.0MySQL版本:MySQL 5.7.17.0二、相关软件下载:1、PHP下载地址:2、MySQL下载地址:3、Microsoft Visual C++ 2010 可再发行组件包(安装MySQL需要此插件)4、Visual C++ Redistributable for Visual Studio 20...

weixin_34794420的博客 1378

Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

当使用了 AndroidX 后,发现标记为过时了,而是推荐我们使用函数。函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Activity 和 Fragment 之间进行启动其他 Activity 并接收结果的过程,取代了传统的和方法。使用函数,您可以更容易地管理 Activity 结果的处理,使代码更清晰和模块化。AndroidX 是 Android 中的一个开发库,旨在简化 Android 应用程序的开发和维护。

阿飞的博客 5126

Win11 C盘瘦身终极指南:哪些能删/能移/不能碰?附详细目录清单

本文提供了一份详细的Win11 C盘瘦身终极指南,清晰区分了可安全删除、适合迁移以及绝对不能触碰的系统目录。文章不仅列出了具体的文件夹清单与操作建议,还介绍了使用符号链接和Robocopy进行安全迁移的高阶方法,并附带了自动化脚本,帮助用户从根本上解决C盘空间不足的问题,同时确保系统稳定。

weixin_29246195的博客 1547

android baseactivity 网络封装,详解Android封装一个全局的BaseActivity

1.前言对于一个Android开发者来说,每一个页面都继承一个单独的系统Activity,有时候会带来很多不必要的困扰。比如:每一个页面会有重复的代码,阅读起来麻烦;每一次写新的页面功能总要打开原来的页面代码拷贝一部分过来;有时候代码调试排查问题也不方便等等。如果你的项目里面没有将Activity都继承自一个自己封装的BaseActivity、或者针对自己封装的BaseActivity觉得还不够完...

weixin_31293841的博客 778

基于注意力机制的行人重识别(Reld)模型论文解读----Relation-Aware Global Attention for Person Re-identification

任务概述:在多摄像头的复杂场景中,快速定位查找指定目标的所有结果。

qq_52053775的博客 1895

【YOLOv8科研级优化】集成YOLOv10的SCDown采样模块,让你的模型下采样更高效更精准

打开确保模型解析器能识别SCDown模块。通过将YOLOv10的SCDown模块集成到YOLOv8中,我们实现了一个“细节保留+高效下采样”的目标检测模型。这个改进不仅在工程上能提升小目标、细粒度场景的检测效果,更在科研上提供了“分阶段下采样”的创新思路——这种思路可以延伸到其他卷积网络(如ResNet、MobileNet)的下采样层改进中,帮你在论文中打造独特的研究点。

m0_71589036的博客 137

关于Android封装一个全局的BaseActivity你需要知道的

关于Android封装一个全局的BaseActivity你需要知道的1.前言2.特点3.代码及说明3.1.优缺点3.2.代码3.3.注意点4.总结 1.前言 对于一个Android开发者来说,每一个页面都继承一个单独的系统Activity,有时候会带来很多不必要的困扰。比如:每一个页面会有重复的代码,阅读起来麻烦;每一次写新的页面功能总要打开原来的页面代码拷贝一部分过来;有时候代码调试排查问题也不方便等等。 如果你的项目里面没有将Activity都继承自一个自己封装的BaseActivity、或者针对自己

fanhenghao的博客 1774

安路TangDynasty和FD和JTAG驱动器安装

安路FPGA产品矩阵包含SALPHOENIX高性能、SALEAGLE高性价比和SALELF低功耗三大系列,广泛应用于网络通信、消费电子等领域。配套的TangDynasty(TD)集成开发环境支持标准设计输入,提供完整优化流程与调试工具。简要介绍了TD 6.2.1版本的安装步骤。

wangjie36的博客 1039

android baseactivity 网络封装,Android-打造无敌解耦的BaseActivity

封装库:zone-sdk设计模式:观察者模式目的:解耦,各司其职。拍照等涉及onActivityResult的封装逻辑图BaseActivityActivityKinds(观察者的基类): 在使用的BaseActivity注册ActivityKinds或者移除不必要的ActivityKinds专注:onCreate,onResume,onActivityResult,onPause,onDestr...

weixin_39838362的博客 278

《UDS协议从入门到精通》系列——图解0x10:诊断会话控制

什么是诊断会话控制服务?切换模式时ECU要做哪些?有没有通信示例?本文全网最详解!!

车载系统攻城狮 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android中ViewBinding封装BaseActivity,BaseFragment使用

1.代码混淆 因封装使用了反射,所以混淆规则需将反射调用方法禁止混淆 # ViewBinding -keepclassmembers class * implements androidx.viewbinding.ViewBinding { public static * inflate(android.view.LayoutInflater); } 2.封装BaseActivity(关键代码段) abstract class BaseActivity<VB : ViewBinding

tywfeng的专栏 3463

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android 基类BaseActivity的封装

正文一般来说,不同的项目的BaseActivity不尽相同,根据不同的业务逻辑和功能需求,会有很多区别。这里总结了一些,如下:一般的Activity里都会用到很多的findViewById这个方法,而且每次都要强制类型转换,这样会显得很繁琐,如果在BaseActivity里封装好,就能省事:protected &lt;T extends View&gt; T findView(int id) { ...

剑精灵的博客 553

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android baseactivity 网络封装,Android BaseActivity与BaseFragmnt的封装方法

注意了需要使用butterknife进行初始化baseactivity:public abstract class activity extends appcompatactivity {protected placeholderview mplaceholderview;@overrideprotected void oncreate(@nullable bundle savedinstance...

weixin_39737001的博客 229

Android封装含有通用标题栏的基类BaseActivity

安卓开发中,经常会遇到项目的标题栏基本样式都是一致的,只有个别界面需要定制化,而TitltBar或许跟我们的业务需求不是很相符,所以很多时候我们都想要去封装一个含有通用标题栏并且可定制化的BaseActivity。本文希望对有这方面需求的童鞋提供一种参考。效果图类似于这样 首先很多开发者比较喜欢的一种做法是写一份通用的标题栏布局,然后在每次创建的Activity的布局文件中去选择includ...

Leo Wang的博客 2855

android baseactivity 网络封装,Android 架构设计-BaseActivity设计(待更新)

BaseActivity 存在的意义定义子类的行为,成为一个模板告诉你的子类责任是什么将子类要用的东西封装好,给子类调用,避免重复代码限制其项目组的代码规范,统一风格统一UI1.定义子类的行为,成为一个模板告诉你的子类责任是什么一、Activity的行为接受上个Activity传过来的值填充布局初始化View初始化数据,连接网络拉取json在Oncreate里面使用四个抽象方法/*** 填充布局*...

weixin_39980841的博客 220

android常用封装,android常用封装 --- BaseActivity

public abstract class BaseActivity extends Activity {/*** 记录处于前台的Activity*/private static BaseActivity mForegroundActivity = null;/*** 记录所有活动的Activity*/private static final List mActivities = new Link...

weixin_42530172的博客 259

Android开发:Android简单通用BaseActivity基类的封装

目录 一、BaseActivity基类的封装 二、继承基类BaseActivty的Activity的使用事例 三、基类中的Activity工具类ActivityCollector(参考郭霖第二行代码) 一、BaseActivity基类的封装 ...

小五博客园 9349

Android BaseActivity、BaseFragment等 常用方法封装

BaseActivity、BaseFragment等 常用方法封装 Log类的封装

青芸的博客 3878
上一篇: android 运行时权限解析RxPermissions的使用
下一篇: RecyclerView分组之BaseRecyclerViewAdapterHelper(实现分组功能)
夏轩00
博客等级 码龄10年 12粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值