1.在Context中通过public boolean bindService(Intent service,ServiceConnection conn,int flags)
方法来进行Service与Context的关联并启动,并且Service的生命周期依附于Context。
2.通过public ComponentName startService(Intent service)
方法去启动一个Service,此时Service的生命周期与启动它的Context无关。(要注意的是,whatever,都需要在xml里注册你的Service)
静态注册:在AndroidManifest.xml文件中进行注册,当App退出后,Receiver仍然可以接收到广播并且进行相应的处理
动态注册:在代码中动态注册,当App退出后,也就没办法再接受广播了
ContentProvider是用于将数据共享给其他应用。点击打开链接
Service设置成START_STICKY
kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
提升service优先级
在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"
这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
提升service进程优先级
Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收,当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以在startForeground()使用startForeground()将service放到前台状态。这样在低内存时被kill的几率会低一些。(如果在极度极度低内存的压力下,该service还是会被kill掉,并且不一定会restart())
onDestroy方法里重启service
service +broadcast 方式,就是当service走onDestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。
直接在onDestroy()里startService。(当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证)
监听系统广播判断Service状态
通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限
大招: 放一个像素在前台(手机QQ)
tween 补间动画。通过指定View的初末状态和变化时间、方式,对View的内容完成一系列的图形变换来实现动画效果。Alpha、Scale、Translate、Rotate。
frame 帧动画AnimationDrawable 控制animation-list xml布局
PropertyAnimation 属性动画
SQLite:SQLite是一个轻量级的数据库,支持基本的SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,
封装了一些操作数据库的api
SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。
File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,
但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),
如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。
点击打开链接
在Application中定义一个static常量,赋值为-1,在欢迎界面改为0,如果被强杀,application重新初始化,在父类Activity判断该常量的值。
解决:如果在每一个Activity的onCreate里判断是否被强杀,冗余了,封装到Activity的父类中,如果被强杀,跳转回主界面,如果没有被强杀,执行Activity的初始化操作,给主界面传递intent参数,主界面会调用onNewIntent方法,在onNewIntent跳转到欢迎页面,重新来一遍流程。