Android工程目录结构:
« 熟练掌握Android四大组件,常用的布局文件
Android中4大组件是:ContentProvider、Activity、BroadcastReceiver和Service
一、清单文件:
1、所有的应用程序必须要有清单文件
在manifest节点下需要声明当前应用程序的包名
2、包名:声明包的名字,必须唯一
如果两个应用程序的包名和签名都相同,后安装的会覆盖先安装的
3、声明的程序的组件(4大组件)
其中比较特殊的是广播接收者,可以不在清单文件中配置,可以通过代码进行注册
4、声明程序需要的权限:保护用户的隐私
5、可以控制服务在单独的进程中的,四大组件都可以配置这个属性process
在组件节点配置process:
如:android:process=“xxx.ooo.xxx”
比如说:处理图片的时候,会很耗内存,就需要在单独的新的进程中,可以减少内存溢出的几率

二、ContentProvider 内容提供者
1、特点
①、可以将应用中的数据对外进行共享;
②、数据访问方式统一,不必针对不同数据类型采取不同的访问策略;
③、内容提供者将数据封装,只暴露出我们希望提供给其他程序的数据(这点有点类似Javabeans);
④、内容提供者中数据更改可被监听;
2、创建:
1.1、定义类继承ContentProvider, 实现6个抽象方法(ContentResolver对象是解析ContentProvider对象的)
在查询时,query,返回的Cursor前不用关闭db,否则customer是空
1.2、清单文件中的节点下定义节点, 指定name和authorities属性
因为在应用目录下,所以可以写成android.name=” . 类名”,如创建的类是MyProvider,并且在应用目录下,写成:android.name=” .MyProvider”,不过不建议这样写,因为不明确是什么应用
在清单文件中配置的时候,可以指定权限android.readpremission
1.3、内容提供者并不是在应用发布的时候创建,而是在第一次访问自定义的继承ContentProvider类的时候才被创建出来
Tips:
其中的authorities是作为当前应用的唯一标识,虽然可以任意写,但是需要遵循一定的规范:建议是公司名.providers.表名provider,或者是其他的约定的规范
如:com.itheima.providers.personprovider等
3、访问:
通过Context对象获取ContentResolver对象
ContentResolver就可以调用增删改查方法了, 方法中都需要传入一个Uri
Uri的格式: content://authorities/path/id
Tips:Uri代表了要操作的数据

4、监听内容提供者的数据变化
1)在内容提供者中可以通知其他程序数据发生变化
通过Context的getContentResolver()方法获取ContentResolver
调用其notifyChange()方法发送数据修改通知,发送到系统的公共内存(消息信箱中)
2) 在其他程序中可以通过ContentObserver监听数据变化
通过Context的getContentResolver()方法获取ContentResolver
调用其registerContentObserver()方法指定对某个Uri注册ContentObserver
自定义ContentObserver,重写onChange()方法获取数据
5、区别Provider/Resolver/Observer
1)ContentProvider:内容提供者
把一个应用程序的私有数据(如数据库)信息暴露给别的应用程序,让别的应用程序可以访问;
在数据库中有对应的增删改查的方法,如果要让别的应用程序访问,需要有一个路径uri:
通过content:// 路径对外暴露,uri写法:content://主机名/表名
2)ContentResolver:内容解析者
根据内容提供者的路径,对数据进行操作(crud);
3)ContentObserver:内容观察者
可以理解成android系统包装好的回调,数据发送变化时,会执行回调中的方法;
ContentResolver发送通知,ContentObserver监听通知;
当A的数据发生变化的时候,A就会显示的通知一个内容观察者,不指定观察者,就会发消息给一个路径
三、Activity活动
UI线程虽然叫UI线程,但它并不是只管绘制界面,UI线程就是主线程,activity是对象,主线程调用activity对象来绘制界面。
因为调用过程中是锁定的,所以也只有主线程可以修改UI,所有得名UI线程。
既然是面向对象你就该以对象为核心,线程工作其实就是调用对象,activity之间的切换只不过就是主线程在调用不通的activity对象而已。

描述:
1)表示用户交互的一个界面(活动),每一个activity对应一个界面
2)是所有View的容器:button,textview,imageview;我们在界面上看到的都是一个个的view
3)有个ActivityManager的管理服务类,用于维护与管理Activity的启动与销毁;
Activity启动时,会把Activity的引用放入任务栈中
4)一个应用程序可以被别的应用程序的activity开启
此时,是将此应用程序的引用加入到了开启的那个activity的任务栈中了
5) activity是运行在自己的程序进程里面的
在一个应用程序中,可以申请单独的进程,让此应用程序中的一个组件在新的进程中运行
6)可以在activity里面添加permission标签,调用者必须加入这个权限
与钱打交道的界面,都不允许被其他应用程序随意打开
如果觉得那个activity比较重要,可以在清单文件中配置,防止别人随意打开,需要配置一个权限
自定义权限:
在清单文件中配置permission,创建一个新的权限
创建后,就会在清单文件中生成这个权限了
此时,需要开启这个界面,就需要使用这个权限
Tips:
*不可使用中文文本,需要使用字符串,抽取出来
声明之后,会在gen的目录下,多出来一个文件:Manifest的文件,系统也存在一个这样的文件
1、创建Activity
1)定义类继承自Activity类;
2)在清单文件中Application节点中声明节点;






2、启动Activity
通过意图(Intent)来启动一个Activity;
1) 显示启动:
显示启动一般用于自己调用自己的情况(在当前应用找),这样的启动方式比较快速,创建Intent后指定包名和类名;
Intent intent = new Intent(this, OtherActivity.class);
startActivity(intent); // 启动新的Activity
或者:
Intent intent = new Intent();
intent.setClassName(“com.itheima.activity”, “com.itheima.activity.OtherActivity”); // 包名、全类名
startActivity(intent); // 启动新的Activity
2)隐式启动:
一般用于调用别人的Activity,创建Intent后指定动作和数据以及类型;
// 电话
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL); // 设置动作
intent.setData(Uri.parse(“tel://123456”)); // 设置数据
// 网页
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(“http://192.168.1.45:8080/androidWeb”));
// 音频/视频,设置type
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(“file:///mnt/sdcard/daqin.mp3”), "audio/
"); // 设置数据和数据类型,将启动音频播放器(vedio)
3)为隐式启动配置意图过滤器:
显式意图是指在创建意图时指定了组件,而隐式意图则不指定组件,通过动作、类型、数据匹配对应的组件;
在清单文件中定义时需要定义才能被隐式意图启动;
中至少配置一个和一个,否则无法被启动;
Intent对象中设置的action、category、data在必须全部包含Activity才能启动;
中的、、都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动;
如果一个意图可以匹配多个Activity,Android系统会提示选择;

3、启动时传递数据
可通过意图Intent对象实现Activity之间的数据传递;使用Intent.putExtra()方法装入一些数据, 被启动的Activity可在 onCreate方法中getIntent()获取;
可传输的数据类型: a.基本数据类型(数组), b. String(数组), c. Bundle(Map), d. Serializable(Bean), e.Parcelable(放在内存一个共享空间里);
接收数据:在OtherActivity 的onCreate()方法,通过 getIntent().get 相关的数据的方法来获取数据;

4、关闭时返回数据
基本流程:
l 使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity;
l 重写onActivityResult(int requestCode, int resultCode, Intent data) 方法;
l 新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用上面的onActivityResult方法;
注意:新的Activity的启动模式不能设置成 singleTask(如果已创建,会使用以前创建的)与singleInstance(单例,单独的任务栈),
不能被摧毁(执行不到finish方法),父Activity中的 onActivityResult方法将不会执行;
finish():表示关闭当前Activity,会调用onDestroy方法;
5、生命周期
Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:oncreate ondestroy onstop onstart onresume onpause
其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;
onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;

比如说教育应用宝客户端每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操作 就放在onStart()的方法里面.
fillData() 这样保证每次用户看到的数据都是最新的.
1)Acitivity三种状态
a. 运行:activity在最前端运行;
b. 停止:activity不可见,完全被覆盖;
c. 暂停:activity可见,但前端还有其他activity<>,注意:在当前Activitiiy弹出的对话框是Activity的一部分,弹出时,不会执行onPause方法;
2)生命周期相关的方法(都是系统自动调用,都以 on 开头):
a. onCreate: 创建时调用,或者程序在暂停、停止状态下被杀死之后重新打开时也会调用;
b. onStart: onCreate之后或者从停止状态恢复时调用;
c. onResume: onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart,也会调用onResume(界面获得焦点);
d. onPause: 进入暂停、停止状态,或者销毁时会调用(界面失去焦点);
e. onStop: 进入停止状态,或者销毁时会调用;
f. onDestroy: 销毁时调用;
g. onRestart: 从stop状态恢复时调用;
应用启动时,执行onCreate onStart onResume,退出时执行:onPause onStop onDestroy;
3)生命周期图解:
6、横竖屏切换与信息的保存恢复
1)切换横竖屏时,会自动查找layout-port 、layout-land中的布局文件,默认情况下,切换时,将执行摧毁onPause onStop onDestroy,再重置加载新的布局onCreate onStart onResume;切换时如果要保存数据, 可以重写: onSaveInstanceState();恢复数据时, 重写: onRestoreInstanceState();
2)固定横屏或竖屏: android:screenOrientation=“landscape”
3)横竖屏切换, 不摧毁界面(程序继续执行) android:configChanges=“orientation|keyboardHidden|screenSize” 只会执行onConfigurationChanged方法
保存信息状态的相关方法:
a. onSaveInstanceState: 在Activity被动的摧毁或停止的时候调用(如横竖屏切换,来电),用于保存运行数据,可以将数据存在在Bundle中;
b. onRestoreInstanceState:该方法在Activity被重新绘制的时候调用,例如改变屏幕方向,onSavedInstanceState可为onSaveInstanceState保存的数据

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. mybatisplus的坑 insert标签insert into select无参数问题的解决
  3. python起点网月票榜字体反爬案例
  4. Python list sort方法的具体使用
  5. python list.sort()根据多个关键字排序的方法实现
  6. android上一些方法的区别和用法的注意事项
  7. 《Android开发从零开始》——25.数据存储(4)
  8. android实现字体闪烁动画的方法
  9. Android(安卓)Wifi模块分析(三)

随机推荐

  1. android - Content-Type大全
  2. 【AS-AndroidX】AndroidX迁移-常用控件和
  3. Android: 在WebView中获取网页源码
  4. xml文件的序列化示例
  5. H5判断IOS或Android
  6. 进度条、拖动条
  7. Android(安卓)Studio报错
  8. Android(安卓)实现相机功能【完整源码】
  9. nginx android app 慢网络请求超时
  10. android之自定义进度条的背景和进度的颜