android完全退出以及RxBinding研读

本文探讨了如何使用RxBinding处理Android UI响应,它基于RxJava,提高了代码可读性。通过RxActivity的subscribe方法实现观察者模式,确保活动之间的交互。文章提到了两种完全退出Android应用的方法:一是清空活动栈并逐个调用finish(),二是清空栈并结束进程。此外,还提供了RxBinding库的引入方式和相关资源链接。

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

RxBinding用来处理安卓UI响应,沿用了RxJava(android)的风格,可以切换线程和变形,让代码可读性提高。上代码:

1、RxActivity

package com.example.test.activity;

import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;

import com.example.test.R;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;

import java.util.concurrent.TimeUnit;

import rx.functions.Action1;

/**
 * @authore WinterFellSo 2017/3/22
 * @purpose Rx系列库,RxJava(Android)、RxBingding
 */
public class RxActivity extends BaseActivity {

    private Button throttleFirst;

    private Button showColor;

    private CheckBox checkBoxChange;

    @Override
    protected int getContentLayout() {
        return R.layout.activity_rx;
    }

    @Override
    protected void initGui() {
        throttleFirst = (Button) findViewById(R.id.throttleFirst);
        showColor = (Button) findViewById(R.id.showColor);
        checkBoxChange = (CheckBox) findViewById(R.id.checkBoxChange);
    }

    @Override
    protected void initAction() {
        //两秒钟之内只取一个点击事件,防抖操作
        RxView.clicks(throttleFirst)
                .throttleFirst(2, TimeUnit.SECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        Toast.makeText(RxActivity.this, "点击", Toast.LENGTH_SHORT).show();
                    }
                });
        //监听长按时间
        RxView.longClicks(throttleFirst)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        Toast.makeText(RxActivity.this, "长按", Toast.LENGTH_SHORT).show();
                    }
                });
        //复选框监听
        RxCompoundButton.checkedChanges(checkBoxChange)
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean aBoolean) {
                        showColor.setEnabled(aBoolean);
                        showColor.setBackgroundResource(aBoolean ? android.R.color.holo_red_light : android.R.color.holo_blue_bright);
                    }
                });
    }

    @Override
    protected void initData() {

    }
}

subscribe方法(RxJava具有的)就是订阅(RxJava用到的是观察者模式,被观察者与观察者通过订阅来建立联系),当建立联系的时候会自动调用call方法

2、BaseActivity

package com.example.test.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.widget.ListView;

import com.example.test.R;
import com.example.test.application.BaseApplication;
import com.example.test.data.ActivityTack;
import com.example.test.data.DataCenter;

/**
 * @authore WiActivitynterFellSo 2017/3/22
 * @purpose 基础
 */
public abstract class BaseActivity extends Activity{

    protected Activity ctx;

    protected BaseApplication app;

    private long lastClickTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        // 取消标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // 设置全屏
        // window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        // WindowManager.LayoutParams.FLAG_FULLSCREEN);
        // 高亮
        // window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        // 添加到activity stack管理集合
        ActivityTack.getInstanse().addActivity(this);
        ctx = this;
        app = (BaseApplication) getApplication();
        app.setContext(ctx);
        if (getContentLayout() != 0) {
            setContentView(getContentLayout());
        }
        initGui();
        initAction();
        initData();
    }

    /**
     *
     * @Title: isFastDoubleClick
     * @Description: 判断事件出发时间间隔是否超过预定值
     * @param @return
     * @return boolean
     * @throws
     */
    public boolean isFastDoubleClick() {
        long time = System.currentTimeMillis();
        long timeD = time - lastClickTime;
        if (0 < timeD && timeD < 1000) {
            return true;
        }
        lastClickTime = time;
        return false;
    }

    public void startActivity(Intent intent) {
        // 防止连续点击
        if (isFastDoubleClick()) {
            return;
        }
        super.startActivity(intent);
    }

    protected abstract int getContentLayout();

    protected abstract void initGui();

    protected abstract void initAction();

    protected abstract void initData();

    //完全退出
    public void exit(){
        ActivityTack.getInstanse().exit();
    }

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

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

    @Override
    public void onResume() {
        super.onResume();
    }
}

每个Activity都会集成虚类BaseActivity;每个activity创建时候,都会加入到一个全局列表当中。android完全退出:

第一种,退出时候,线性表清空且每个activity都会调用finish();

第二种:清空线性表,且杀进程

		// 结束进程
		android.os.Process.killProcess(android.os.Process.myPid());
		System.exit(0);

3、ActivityTack

package com.example.test.data;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import android.app.Activity;

import com.example.test.activity.BaseActivity;

public class ActivityTack {

	public List<Activity> activityList = new ArrayList<Activity>();

	public static ActivityTack tack = new ActivityTack();

	public static ActivityTack getInstanse() {
		return tack;
	}

	private ActivityTack() {

	}

	public BaseActivity getBaseActivity() {
		if (activityList != null && activityList.size() > 0) {
			return (BaseActivity) activityList.get(activityList.size() - 1);
		}
		return null;
	}

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

	public void removeActivity(Activity activity) {
		if (activity != null) {
			activityList.remove(activity);
			activity.finish();
			activity = null;
		}
	}

	public void removeAllActivity() {
		while (activityList.size() > 0) {
			popActivity(activityList.get(activityList.size() - 1));
		}
	}

	/**
	 * 完全退出
	 * 
	 * @param context
	 */
	public void exit() {
		while (activityList.size() > 0) {
			popActivity(activityList.get(activityList.size() - 1));
		}
		// 结束进程
		android.os.Process.killProcess(android.os.Process.myPid());
		System.exit(0);
	}

	/**
	 * 根据class name获取activity
	 * 
	 * @param name
	 * @return
	 */
	public Activity getActivityByClassName(String name) {
		for (Activity ac : activityList) {
			if (ac.getClass().getName().indexOf(name) >= 0) {
				return ac;
			}
		}
		return null;
	}

	public Activity getActivityByClass(Class cs) {
		for (Activity ac : activityList) {
			if (ac.getClass().equals(cs)) {
				return ac;
			}
		}
		return null;
	}

	/**
	 * 弹出activity
	 * 
	 * @param activity
	 */
	public void popActivity(Activity activity) {
		removeActivity(activity);
		activity.finish();
		activity = null;
	}

	/**
	 * 弹出activity到
	 * 
	 * @param cs
	 */
	@SuppressWarnings("rawtypes")
	public void popUntilActivity(Class... cs) {
		List<Activity> list = new ArrayList<Activity>();
		for (int i = activityList.size() - 1; i >= 0; i--) {
			Activity ac = activityList.get(i);
			boolean isTop = false;
			for (int j = 0; j < cs.length; j++) {
				if (ac.getClass().equals(cs[j])) {
					isTop = true;
					break;
				}
			}
			if (!isTop) {
				list.add(ac);
			} else
				break;
		}
		for (Iterator<Activity> iterator = list.iterator(); iterator.hasNext();) {
			Activity activity = iterator.next();
			popActivity(activity);
		}
	}
}
如果要读懂RxBinding,应该先去了解RxJava,推荐可以看这篇博客文(需要有点耐心)

点击打开链接


RxBinding的git地址(android studio引入库)

点击打开链接


RxJava&RxJava Android&RxBinding所有类库,可以从下面地址下载

点击打开链接





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值