android完全退出以及RxBinding研读

来源:互联网 发布:淘宝买手机怎么看真假 编辑:程序博客网 时间:2024/05/22 20:34

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);} elsebreak;}for (Iterator<Activity> iterator = list.iterator(); iterator.hasNext();) {Activity activity = iterator.next();popActivity(activity);}}}
如果要读懂RxBinding,应该先去了解RxJava,推荐可以看这篇博客文(需要有点耐心)

点击打开链接


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

点击打开链接


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

点击打开链接





0 0