打卡20
四大组件
Activity可视化界面,Service无界面后台服务,ContentProvider数据共享内容提供者,BroadcastReceiver消息传递广播
Activity切换横竖屏时会重新走生命周期,从onstop到onCreate,如果在清单文件配置android:configChanges="orientation|keyboardHidden|screenSize"就可以避免该情况onNewIntent调用时机,Intent是用来进行组件间通信的,那onNewIntent就是用来处理新的数据通信,在每次复用得时候调用,即走onRestart()生命周期得时候调用。Intent传输数据的大小是有限制的,因为Intent 中的 Bundle 是使用 Binder 机制进行数据传送的, 数据会写到内核空间,即Binder 缓冲区域,缓冲区大小一般是1-2M。Activity启动模式,standard默认模式(每次startActivity会创建新得Activity);SingleTop栈顶复用模式;SingleTask栈种单例模式;SingleInstance全局系统单例模式Service和Activity进行通信,通过bindService()可以实现Activity调用Service中的方法;通过广播实现Service向Activity发送消息Activity 的启动过程,调用 startActivity() 后经过重重方法会转移到 ActivityManagerService 的 startActivity(),并通过一个 IPC 回到 ActivityThread 的内部类 ApplicationThread 中,并调用其scheduleLaunchActivity()将启动Activity的消息发送并交由Handler H处理。Handler H对消息的处理会调用handleLaunchActivity()->performLaunchActivity()得以完成Activity对象的创建和启动onSaveInstanceState(),onRestoreInstanceState的调用时机,当系统内存不足等原因回收Activity,Activity销毁前会调用onSaveInstanceState()用来保存数据;当再次启动被回收的Activity会调用onRestoreInstanceState();如切换横竖屏生命周期如下onPause() –> onSaveInstanceState() –> onStop() –> onDestroy() –> onCreate() –> onStart() –> onRestoreInstanceState() –> onResume()
Activity、Window、DecorView与ViewRoot之间的关系
Acitiviy不是真正的展示窗口,是作为一个载体与入口的存在。
PhoneWidow是真正的展示窗口,一个Activity上面有一个PhoneWindow,PhoneWinow上有一个DecoView
DecoView上面的ContentView(R.id.content)才是我们真是写的布局文件所展示的位置,PhoneWindow通过WindowManager管理DecoView
ViewRoot 是 DecorView 的管理者,它负责 View 树的测量、布局、绘制,以及事件分发入口。
WMS是PhoneWindow的管理者,是一个系统服务,管理window的显示隐藏以及要显示的位置
安卓存储数据方式(重要)
文件存储、SQLite数据库、SharedPreferences、ContentProvider、网络
1.SharedPreferences
优点: 轻量级,以键值对的方式进行存储,使用方便,易于理解
采用的是 XML 文件形式存储在本地,程序卸载后会也会一并被清除,不会残留信息
缺点: 列表式的数据不支持,储存相对单一,无法条件查询,不适合大量的数据存储。 在跨进程通讯中不去使用 SharedPreferences 键值对不宜过多
2.文件存储
**优点:**可以在设备本身的存储设备或者外接的存储设备中创建用于保存数据的文件。
**缺点:**同样在默认的状态下,文件是不能在不同的程序间共享。
3.ContentProvider
Android 系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个 ContentProvider 都会对外提供一个公共的 URI(包装成 Uri 对象),如果应用程序有数据需要共享时,就需要使用 ContentProvider 为这些数据定义一个 URI,然后其他的应用程序就通过 Content Provider 传入这个 URI 来对数据进行操作。
4.SQLite 数据库
优点: 轻量级,独立性,隔离性,安全性
缺点: SQLite 在并发的读写方面性能不是很好,数据库有时候可能会被某个读写操作独占,可能会导致其他的读写操作被阻塞或者出错。
5.网络存储
优点: 几乎可以不用担心内存问题,本地处理麻烦的可以交由服务器处理
缺点: 完全依赖于网络 ,网络延迟和资费成本都会上升
意图启动activity的方式,分别怎么用,activity之间传数据怎么通过意图传数据
(1)激活另一个手机的方式
public void onClick(View v){ //激活系统的另一个程序 Intent intent = new Intend(); intent.setAction("andriod..intent.action.VIEW"); intent.addCategory("andriod.intent.categeory.DEFAULT"); intent.addCategory("andriod.intent.category.BROWSABLE"); intent.setData(Uri.parse("http://www.hncu.edu.cn/")); startActivity(intent); 监听器 <activity android:name="com.cy.app.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> (2)意图启动activity的方式 public void click01(View view){//显式 Intent intent = new Intent(this,MainActivity02.class); startActivity(intent); } public void click02(View view){//隐式 Intent intent = new Intent(); intent.setAction("com.cy.app.yinshi"); intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent); } 隐式意图需要过滤器 <activity android:name="com.cy.app.YinShiActivity" android:label="@string/title_activity_yin_shi" > <intent-filter> <action android:name="com.cy.app.yinshi"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> (3)如何传递数据 直接传递:intent.putExtra(key, value) 第一个Activity,发送数据 //创建意图对象 Intent intent = new Intent(this,TwoActivity.class); //设置传递键值对 intent.putExtra("data",str); //激活意图 startActivity(intent); 第二个Activity接收数据 // 获取意图对象 Intent intent = getIntent(); //获取传递的值 String str = intent.getStringExtra("data"); //设置值 tv.setText(str);
按钮绑定事件(重点)
方式一 <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="绑定方式1" android:id="@+id/btn1" /> 成员变量 private Button bnt1; 构造方法: bnt1 = findViewById(R.id.btn1); bnt1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this,"绑定方式1",Toast.LENGTH_SHORT).show(); } }); 方式二 <Button android:layout_below="@+id/btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="绑定方式2" android:onClick="click02" android:id="@+id/btn2" /> 成员方法: public void click02(View view){ Toast.makeText(this, "绑定方式2", Toast.LENGTH_SHORT).show(); }