Skip to content

Android 开发技巧二

Mr.wu edited this page Jun 12, 2017 · 12 revisions

能用简单的布局就用简单的,特别是FrameLayout,它的layout_gravity属性非常好用。

android:layout_gravity是设置控件相对父控件的位置 android:gravity是设置控件内部的内容的位置,如button的text的位置设置就使用android:gravity

View类的post和postDelayed方法

稍微有点经验的安卓开发人员应该都知道View类的post和postDelayed方法。我们知道调用这个方法可以保证在UI线程中进行需要的操作,方便地进行异步通信。

public boolean post(Runnable action) {    
  final AttachInfo attachInfo = mAttachInfo;
  if (attachInfo != null) {       
  return attachInfo.mHandler.post(action);
  }    
// Assume that post will succeed later       
  ViewRootImpl.getRunQueue().post(action); 
  return true;
}

意思是将任务添加到消息队列中,保证在UI线程执行。从本质上说,它还是依赖于以Handler、Looper、MessageQueue、Message为基础的异步消息处理机制。相对于新建Handler进行处理更加便捷。下面举一个常用的例子,比如在onCreate方法中获取某个view的宽高,而直接View#getWidth获取到的值是0。要知道View显示到界面上需要经历onMeasure、onLayout和onDraw三个过程,而View的宽高是在onLayout阶段才能最终确定的,而在Activity#onCreate中并不能保证View已经执行到了onLayout方法,也就是说Activity的声明周期与View的绘制流程并不是一一绑定。那为什么调用post方法就能起作用呢?首先MessageQueue是按顺序处理消息的,而在setContentView()后队列中会包含一条询问是否完成布局的消息,而我们的任务通过View#post方法被添加到队列尾部,保证了在layout结束以后才执行。

Activity onUserLeaveHint()

用户手动离开当前activity,会调用该方法,比如用户主动切换任务,短按home进入桌面等。系统自动切换activity不会调用此方法,如来电,灭屏等。

activity无论分发按键事件、触摸事件或者轨迹球事件都会调用Activity#onUserInteraction()。

如果你想知道用户用某种方式和你正在运行的activity交互,可以重写Activity#onUserInteraction()。

所有调用Activity#onUserLeaveHint()的回调都会首先回调 Activity#onUserInteraction()。

Fragment在onAttach方法中接收回调:

 @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mPageSelectedListener = (PageSelectedListener) activity;
            mMenuBtnOnclickListener = (MenuBtnOnClickListener) activity;
            mCommitBtnOnClickListener = (CommitBtnOnClickListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + "must implements listener");
        }
    }

finish()跟System.exit(0)的区别

首先一个Activity是有生命周期的,onCreate,onStart,onResume,onPause,onStop,onDestroy...

finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;当调用System.exit(0)时,杀死了整个进程,这时候活动所占的资源也会被释放。

## requestCode 小于0 两个activity传递数据和返回数据时,请求方的onActivityResult始终无响应,通过debug调试模式也没见调用该方法。查看了各种配置和程序代码,均未发现有错误之处。阅读API才发现requestCode >= 0才起作用。有时使用Activity.RESULT_OK,一样不回调,也是因为.RESULT_OK = -1。

源码的startActivityForResult(Intent intent,int requestCode)的requestCode说明是 : If >= 0, this code will be returned in onActivityResult() when the activity exits.

重要的是这一句:如果用负值的requestCode和调用startActivity是一样的,所以代码不走startActivityForResult而是startActivity

Using a negative requestCode is the same as calling * {@link #startActivity} (the activity is not launched as a sub-activity).

Gradle的Android插件version和Gradle的verion对应关系问题。

参考:http://www.jianshu.com/p/b1d5e31e2011#

Home

Android 开发录

-深入理解LayoutInflater.inflate()的参数

计算机网络原理

数据库

Java 垃圾回收机制

Java 开发录

面试

搭建翻墙shadowsocks 教程

其他

Clone this wiki locally