用最优雅的方式startActivity

本文介绍了如何优雅地使用startActivity,通过一个开源库AutoGo,利用建造者模式和编译时注解,实现链式调用启动Activity,减少模板代码,并详细解释了其实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

相信很多人看到标题startActivity可能会轻蔑一笑,启动Activity不是Android开发里基础得不能再基础的内容吗? 但相信点进来的各位看官都是追求优雅编码的开发者:) 。我要用一个优雅的姿势,最小的代码来启动一个Activity。

startActivity的原生式

启动Activity原生方式是new 一个Intent,将需要传递的参数put进Intent,再调用Activity#startActivity:

        Intent intent = new Intent(this, TestActivity.class);
        intent.putExtra("age", age);
        intent.putExtra("name", name);
        startActivity(intent);

startActivity的改进式

在开发当中,往往需要知道TargetActivity要接收的参数有哪些,难道我们每次启动TargetActivity都要打开TargetActivity.java看看它需要哪些参数,而且在TargetActivity取出参数的时候还得记住每一参数的key? 为什么不让厨师列一份食材清单,而不是每次需要炒菜时都去问厨师需要什么食材呢。聪明的开发者想到了在TargetActivity加一个静态方法,将启动Activity的工作都放到这个方法中。

Android中,如果你想通过`ActivityManager`的`sendBroadcast()`或`sendOrderedBroadcast()`方法启动一个新的`Activity`并在后台悄悄地执行,通常是在不需要用户直接交互的情境下(例如系统服务、广播接收者),你可以使用以下步骤: 1. 首先,你需要创建一个`Intent`对象,设置你要启动的`Activity`的完整类名和必要的数据。 ```java Intent intent = new Intent(); intent.setClassName("com.example.app", "com.example.app.MyTargetActivity"); ``` 2. 然后,可以选择将`ACTION_START_ACTIVITY`或`ACTION_START_ACTIVITY_NEW_TASK`作为`Intent`的动作,这取决于是否希望在新的任务栈中启动新活动。 ```java intent.setAction(Intent.ACTION_START_ACTIVITY); ``` 3. 如果你想让这个操作在后台执行,并且不会阻塞当前线程,可以使用`PendingIntent`。`PendingIntent`允许你延迟发送这个意图直到某个特定时间点,比如将来执行某个操作。 ```java PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); ``` 4. 后,在`ActivityManager`中调用`startActivities()`或`startActivityFromBackground()`方法,传入`pendingIntent`,这样目标`Activity`就会在后台启动了。请注意,这两个方法都不会显示用户界面,而是尽量小化对用户体验的影响。 ```java ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); activityManager.startActivities(pendingIntent, null); ```
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值