Android开发——玩转活动

本文介绍几种关于活动的实践技巧。
项目代码继续基于《安卓开发——活动的启动模式》

一、知晓当前在哪个活动

新建一个Java Class:BaseActivity,并让它继承AppCompatActivity,为啥要继承这个可以参考这里或者书的第21页。
在这里插入图片描述
接下来重写onCreate(),可以看到通过getClass().getSimpleName()打印了当前实例的类名:

public class BaseActivity extends AppCompatActivity {
    private static final String TAG = "BaseActivity";
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, getClass().getSimpleName());
    }
}

接下来只要分别让FirstActivity等不再继承AppCompatActivity,而是继承BaseActivity,那么就能知晓当前界面对应的是哪个活动了。
在这里插入图片描述
PS:个人觉得这种方法并不好,其修改了原项目的代码继承的类,如果人家的已经继承其他类了呢?这种情况称为适配器,个人还是推荐使用装饰器模式。

二、随时随地退出程序

退出通常是连续按下BACK键,按下HOME只会将应用挂起,并未退出。那么怎么退出呢?只要用一个集合类对所有活动进行管理就可以了。

新建一个ActivityCollector类作为活动管理器:

public class ActivityCollector {
    private static List<Activity> activities = new ArrayList<>();

    public static void addActivity(Activity activity){
        activities.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for (Activity activity:activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
        activities.clear();
    }
}

在这个活动管理器中用一个List暂存活动,然后用几个方法控制这些活动。接下来修改BaseActivitiey的代码:

public class BaseActivity extends AppCompatActivity {
    private static final String TAG = "BaseActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

这样BaseActivity就会将活动添加或移除到活动管理器里,如果想要退出程序,只需要调用ActivityCollector.finishAll()即可。

给我们的ThirdActivity添加按钮监视器用来退出所有活动:

public class ThirdActivity extends BaseActivity {
    private static final String TAG = "ThirdActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_third);

        Log.d(TAG, "id是"+getTaskId());
        
        Button button3 = (Button)findViewById(R.id.button_3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ActivityCollector.finishAll();
            }
        });
    }
}

运行一下,完美退出:
在这里插入图片描述
为了确保程序完全退出,还可以再加一句代码杀掉进程:

android.os.Process.killProcess(android.os.Process.myPid());

就会杀掉当前程序的进程了。

三、漂亮地启动活动

关于启动活动之前在这里写过:《Android开发——intent在活动间穿梭》
也可以用Intent在活动间传递数据:《Android开发——intent在活动间传递数据》

加入要启动一个其他的活动,传递数据用intent.putExtra(键值,数据)的方式没什么问题,但在开发别人的项目时,我们尚不清楚启动其他活动到底要传递哪些数据。这时,要么老老实实阅读其他活动的代码,要么去问写那个活动的同事,这样岂不是很麻烦?

于是,还有种写法,在要启动的活动(比如SecondActivity)中添加:

 public static void actionStart(Context context, String data1, String data2){
     Intent intent = new Intent(context, SecondActivity.class);
     intent.putExtra("param1", data1);
     intent.putExtra("param2", data2);
     context.startActivity(intent);
 }

我们在自己的活动中添加了actionStart()这个方法,完成了Intent的构建,其中需要的所有数据都通过该方法的参数传递进来,然后再启动SecondActivity
这样就不阅读SecondActivy也能一目了然的知道了需要哪些数据,甚至还简化了启动代码:

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
    }
});

Beautiful !

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值