前台就是和用户交互的进程
可见进程例如一个activity被一个透明的对话框覆盖,该activity就是可见进程
服务:service进程
后台一个activity按了home按键就是从前台退回到后台
标准模式:不管任务栈是否存在相同的activity都会创建一个新的activity存储在任务栈中
Singletop栈顶复用模式创建的activity在栈顶就不用创建该activity
站内复用模式:只要任务栈内存在该activity,就不用创建该activity,将该activity置于栈顶,该activity以上的activity都从任务栈中移除销毁掉出去,会回调onnewIntent方法
最近由于工作需要,使用Scheme方式自定义URL来跨应用间调用,踩了一些坑,现在记录一下。
1、Scheme方式配置
manifest中配置能接受Scheme方式启动的activity
最近由于工作需要,使用Scheme方式自定义URL来跨应用间调用,踩了一些坑,现在记录一下。
1、Scheme方式配置
manifest中配置能接受Scheme方式启动的activity
如果需要配置能被js调起,一定要配置下面这句
- <category android:name="android.intent.category.BROWSABLE"></category>
- android:scheme="app"表示配置接受的协议为app,相当于http://www.baidu.com中的http或者https
- android:host="test"表示配置接受的域名为test,相当于http://www.baidu.com中的www.baidu.com
- 2、使用URL调起Activity
- Uri uri=Uri.parse("app://test");
- Intent intent=new Intent(Intent.ACTION_VIEW,uri);
- startActivity(intent); 3、使用js调起Activity
- window.location = "app://test";
- 通过推送,接受到需要打开的url
- android:scheme="app"表示配置接受的协议为app,相当于http://www.baidu.com中的http或者https
前者适合页面较少,并没有实现真正的内存回收,后者适合页面较多实现了内存真正的回收
fragment调用activity的方法,直接获得getactivity进行调用
activity调用fragement的方法,在fragment中实现接口,在activity中调用接口对象
fragment A调用fragment B的方法,通过getactivity的的findFragment进行调用
service和broadcast都是运行在主线程上,如果service要做耗时操作,可以开启线程的方式,列如在service中访问网络都需要开启线程
Service 中的onStartCommand()必须返回一个整数.这个整数描述了在系统杀死它的事件中系统如何继续这个服务onStartCommand()也返回值必须是下面常量之一:
-
START_NOT_STICKY
如果系统在onStartCommand()返回后杀死了服务,不要重新创建这个service,除非还有挂起的intent需要被传送.这是避免在不必要时运行你的service和当你的应用可以简单重启任何未竟的工作时的最佳选择.
-
START_STICKY
如果系统在onStartCommand()返回后杀死了这个service,会重新创建这个service并且调用onStartCommand(),但是不再重新发送上次最后一个intent,而是使用一个nullintent调用onStartCommand(),除非有一些挂起的intent,在此情况下,这些挂起的intent被派送.这适合于媒体播放器(or或相似也的服务),它不执行命令,但是无限期的运行并等待一个工作.
-
START_REDELIVER_INTENT
如果系统在onStartCommand()返回后杀死了service,重新创建这个service并且使用上次最后一个intent调用onStartCommand().任何挂起的intent都顺序地被派送.这适合于活跃地执行一个工作并且应被立即恢复的服务,比如下载一个文件
在service中发送广播通知activity,不让service和activity直接交互
同一一个app不同组件的通信
动态注册一定要在activity的ondestory中销毁,否则会内存泄露
动态注册的声明周期和activity一样,activity销毁广播就销毁
静态注册即使activity销毁了,也能收到广播
binder比传统的进程的上面更加高效,binder能够进行身份的安全性检查
在生成handle对象的时候,每一个线程拥有自己的创建了threadLocal对象一个loop对象和一个消息队列,主线程才能更新UI,handler的创建必须在主线程中,looper从消息队列中获得消息,然后由handle来发送,有handle的
hanleMessage方法来处理,处理完成之后返回给Loper继续执行,在取出消息队列
解决handle内存泄露的问题
第一讲handle定义成static类型
第二在activity的ondestory中调用handle.removecall方法
第三:采用弱引用的访问在handle内部持有activity的对象
通过上面的三种方式,能百分之90%解决handle的内存泄露
总结:
View绘制分三个步骤,顺序是:onMeasure,onLayout,onDraw。经代码亲测,log输出显示:调用invalidate方法只会执行onDraw方法;调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。
所以当我们进行View更新时,若仅View的显示内容发生改变且新显示内容不影响View的大小、位置,则只需调用invalidate方法;若View宽高、位置发生改变且显示内容不变,只需调用requestLayout方法;若两者均发生改变,则需调用两者,按照View的绘制流程,推荐先调用requestLayout方法再调用invalidate方法。
相关知识点:
1.invalidate和postInvalidate:invalidate方法只能用于UI线程中,在非UI线程中,可直接使用postInvalidate方法,这样就省去使用handler的烦恼。