今天总结下项目中用到小知识点,以前也没注意过,今天就单独写个日志吧。
我们经常是在主线程中创建handler,创建的步骤也直接new一个就行,并没有注意在子线程中创建。
下面是概念:
1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的;
2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定;
3.Message:消息;
4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表;
5.Looper:消息循环,从MessageQueue中取出Message进行处理;
6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循环线程.
上面就不说了,网上都是这个差不多。
主要是在子线程中,下面是代码
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare()
handler2 = new Handler();
Looper.loop()
}
}).start();
主要是要先获得looper然后在获得handler这个顺序必须是这样,原因是子线程是没有默认的looper,在主线程中会默认给出。
下面是主线程中的源码,
public static void main(String[] args) {
SamplingProfilerIntegration.start();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
EventLogger.setReporter(new EventLoggingReporter());
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
可以看到创建了looper,在第7行prepaerMainLooper(),下面给出源码
public static final void prepareMainLooper() {
prepare();
setMainLooper(myLooper());
if (Process.supportsProcesses()) {
myLooper().mQueue.mQuitAllowed = false;
}
}
如果子线程中没有先调用Looper.prepare().会报错:
Can't create handler inside thread that has not called Looper.prepare()
因为没looper对象创建
下面是关于onNewIntent的内容了。这里主要是结合四种activity的启动模式使用的。(启动模式就不列举了,网上太多)
例如:
你的activity启动模式为单一实例模式,当从其他的activity跳转到这个activity时候想通过intent传递数据的时候,想保证每次拿到的intent都是最新的,就要要再onNewIntent(Intent in)中接收activity传递过来的intent,并调用setIntent(in)。
下面是比较全面的说明:
onNewIntent()非常好用,Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume(). 如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()---->onStart()---->onResume()等。
当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。
下面是一则注意事项,也是来自其他文章
注意这句话:
Note that getIntent() still returns the original Intent. You can use setIntent(Intent) to update it to this new Intent.
所以最好是调用setIntent(intent),这样在使用getIntent()的时候就不会有问题了。
基本上就这些了吧。有问题欢迎反馈。