路径
a).Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) //sd卡挂载状态
b).Environment.getExternalStorageDirectory().getPath() //sd卡路径 ->/storage/emulated/0
c).Environment.getDownloadCacheDirectory().getPath() //data/cache路径
d).Environment.getDataDirectory().getPath() //data
权限
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>
<uses-permission android:name=“android.permission.MOUNT_UNMOUNT_FILESYSTEMS”/>
文件存储 a).InputStream getResouces().openRawResource(int id) //返回 InputStream,针对res/raw b).InputStream getAssets().open(String path) //open(“img/smail.jpg”) c).Bitmap BitmapFactory.decodeResouce(resources,int,option) xml、SharedPreference //1).SharedPreference位于data/data/包名/shared_prefs 的xxx.xml文件 SQLiteDatabase ContentProvider 网络
//隐式广播需要在manifest中加上
>>class Receiver:BroadcastReceiver{。 //自定义监听器
onReceive(context:Context?,intent:Intent?){
val action=intent.getAction()
when(action)->{
}
}
}
>>IntentFilter if=IntentFilter() //动态注册广播
if.addAction("action1")
registerReceiver(re:BroadcastReceiver,if)
override fun destroy(){
unregisterReceiver(re:BroadcastReceiver)
}
>>隐式广播(通过action和category匹配)
:1.在Manifest上添加<category android:name="android.intent.category.DEFAULT"/>
:2.标识为android.intent.category.LAUNCHER,则不用添加DEFAULT
>>sendBroadcast(intent) //发送普通广播,静态注册必须描述action标签
:1.val intent=Intent()
intent.action=""intent.addCategory()
>>sendOrderedBroadcast(intent,receivePermission) //发送有序广播
a).<receiver android:name=".smsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
b).setResultExtras(bundle:Bundle) //后续广播通过getResultExtras(true)取回Bundle
c).abortBroadcast() //终止广播传递
>>sendStickyBroadcast(intent) //发送粘性广播,粘性广播以最后一次的内容进行保留
:1.removeStickyBroadcast(intent)
:2.在Manifest中声明android.permission.BROADCAST_STICKY
sp的底层由xml来实现,操作sp的过程就是xml的序列化和解析。xml是存在磁盘上的,因此要考虑io速度。另外dvm的内存是有限的,同时dvm的堆内存为16M,所以不能超过此数字
架构不同
JVM基于栈则意味着需要去栈中读写数据
DVM是基于寄存器的
字节码的执行顺序不同 执行顺序为: .java文件 -> .class文件 -> .jar文件 java文件 –>.class文件-> .dex文件
每个应用都运行在一个DVM实例中,且一个DVM运行在一个独立的进程空间dvm的垃圾回收
采用标记清除
缺点:容易产生很多彼此分隔的小内存块
dvm可划分为Active Heap+Zygote Heap+Card Table+Live Heap Bitmap+MARK HEAP Bitamp ->Zygote Heap 为初始时的进程,而应用程序是由Zygote fork出来的->当创建了应用程序后,会从Zygote heap分出一部分创建Active Heap,之分配的对象都在Active堆进行 ->堆的垃圾回收标记 采用Heap Bitmap位图来存储,划分为Live + Mark ->垃圾回收遍历采用递归,垃圾回收的标准为Live=1,Mark=0 ->垃圾回收的两个阶段,第一个阶段标记根对象 (静态对象、栈、全局变量、寄存器),不允许其他线程运行 第二个阶段遍历被根对象所引用的对象,并标记,此时为Concurrent GC->CardTable,用位图标识第二阶段需要被重新标记的对象,在第二阶段完成后继续标记,此时禁止其他线程
//android4.4之后采用ART作为虚拟机 GC算法分为多种 :
1.Mark-Sweep GC,标记-清楚 :
2.Compacting GC,标记-压缩 新生代采用复制算法,老年代采用标记压缩 //复制算法:内存分为相等的两块,一块用于分配
//结合ActivityThread
->onCreate 创建时执行
a).mInstrumentation.callActivityOnCreate
b).performStart
c).mInstrumentation.callActivityOnRestoreInstanceState
->onStart 可见时执行
->onResume 获取焦点时执行
a).handleResumeActivity
>performResumeActivity
->onPause 失去焦点时执行
a).handlePauseActivity
>performPauseActivity
>if(!r.activity.mFinished&&r.saveState)
mInstrumentation.callActivityOnSaveInstanceState
->onStop 不可见时执行
a).handleStopActivity
>performStopActivityInner
>performPauseActivityIfNeeded
->onDestroy 销毁
a).handleDestroyActivity
->案例分析:Activity A -> Activity B
:1.Activity A的创建,A::onCreate , A:onStart ,A:onResume
:2.跳转 , A:onPause ,B::onCreate,B:onStart,B:onResume,A:onStop
:3.Activity B返回,B:onPause,A:onRestart,A:onStart,A:onResume,B:onStop,B:onDestroy
startActivity(intent:Intent,FLAG_ACTIVITY_NEW_TASK) standard模式启动的Activity,该实例会存放在启动该Activity的Activity所在的任务栈中,而ApplicationContext不存放在任务栈中
->foreground activity ->visible activity ->background activity ->empty process
在没有配置activity的configChanges属性时 Activity的生命周期:onPause->onStop->onCreate->onStart->onResume 配置了activity的configChanges onConfigurationChanged
android:theme=“@android:style/Theme.Dialog”
standard 不管有没有已存在的实例,都生成新实例
singleTop 如果发现有对应的Activity实例位于栈顶,则重复利用,否则创建实例
singleTask a)栈内复用,复用时具有clearTop机制 b)single taskAffinity in task
singleInstance a)启用一个新的栈结构,将Activity放置于栈结构中,并保证不会有其它Activity实例进入 b)方便多个应用共享全局唯一的实例
通过startService调用 onCreate->onStartCommand->onDestroy 通过bindService调用 onCreate->onBind->onUnbind->onDestroyService Binder
>>//示例
a).public class LocalService extends Service{
private static LBinder binder=new LBinder(); //必须声明为static
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public IBinder onBind(Intent intent)
{
return binder;
}
static class LBinder extends Binder{
public int getCount(){
return count;
}
}
}
//开启线程处理耗时操作
>>onCreate //创建单独的HandlerThread处理所有的intent请求
:1.HandlertThread thread = new HandlerThread("")
thread.start()
mServiceLooper =thread.getLooper()
mServiceHandler =new ServiceHandler(mServiceLooper)
onSTartCommand.
:1.public int onStartCommand(Intent intent,int startId){
onStart(intent,startId)
return mRedelivery?START_REDELIVER_INTENT:START_NOT_STICKY;//在于service挂掉了intent是否会回
传
}
:2.public void onStart(Intent intent,int startId)
{
Message msg=mServiceHandler.obtainMessage()
msg.obj=intent
msg.arg1=startId
mServiceHandler.sendMessage(msg)
}
ServiceHandler.
//onHandleIntent,为自定义的类所实现的耗时操作
:1.private final class ServiceHandler extends Handler{
public ServiceHandler(Looper looper){super(looper);}
public void handleMessage(Message msg)
{
onHandleIntent((Intent)msg.obj)
stopSelf(msg.arg1)//当id为最后一个startService的startId时,进行关闭
}
}
总结
a).通过HandlerThread创建线程,并调用getLooper获取looper变量,以新建Handler
b).IntentService通过onStartCommand接收新的intent,并放在message.obj发送过handler
c).handler调用实现的onHandleIntent(intent)
d).Message msg=mServiceHandler.obtainMessage() //obtainMessage和Looper调用msg.relycleUnchecked是以插入链表头部和拆除的形式分配、释放Message资源
>>override fun onCreateOptionsMenu(menu:Menu)
{
getMenuInflater.inflate(R.menu.menu1,menu)
return super.onCreateOptionsMenu(menu)
}
>>setHasOptionsMenu(true) //Fragment onCreate
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。