资源在src/main/res目录
调用方式:
1、在Activity中可以通过getResources().getDrawable方法调用图片资源。
getResources().getDrawable(R.mipmap.ic_launcher); //调用以mipmap开头的文件夹中的资源文件
getResources().getDrawable(R.drawable.icon); //调用以drawable开头的文件夹中的资源文件
2、在XML文件中调用图片资源
@mipmap/ic_launcher //调用以mipmap开头的文件夹中的资源文件
@drawable/icon //调用以drawable开头的文件夹中的资源文件
分为6个等级
属性名称 | 功能描述 |
---|---|
android:id | 设置布局的标识 |
android:layout_width | 设置布局的宽度 |
android:layout_height | 设置布局的高度 |
android:backgroud | 设置布局的背景 |
android:layout_margin | 设置当前布局与屏幕边界、周围布局或控件的距离 |
android:padding | 设置当前布局与改布局中控件的距离 |
LinearLayout 中常见的两个属性
android:orientation | 设置布局内控件的排列顺序 |
android:layout_weight | 在布局内设置控件权重,属性值可直接写int值 |
android:layout_width |
控制文本框的宽度 |
android:layout_height |
控制文本框的高度 |
android:text |
显示文本字符串 |
android:textColor |
控制文字的颜色 |
android:textSize |
控制文字的大小 |
android:gravity |
控制文本框位置,如设置成'center',将居中显示 |
android:layout_width |
控制编辑框的宽度 |
android:layout_height |
控制编辑框的高度 |
android:hint |
设置显示在空间上的提示信息 |
android:maxLines |
设置编辑框的最大行数 |
android:textColor |
控制编辑框输入文字的颜色 |
android:textSize |
控制编辑框输入文字的大小 |
android:textStyle |
控制编辑框输入文字的样式 |
1、在布局文件中指定onClick属性的值
2、使用匿名内部类
btn.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view){
//实现点击事件的代码
}
);
3、使用Activity实现OnClickListener接口
public class Activity extends AppCompatActivity implements View.onClickListener{
@Override
protected void onCreate (Bundle savedInstanceState){
......
btn.setOnClickListener(this);
}
@Override
public void onClick(View view){
//实现点击事件的代码
}
}
BaseAdapter SimpleAdapter ArrayAdapter
1、启动状态 2、运行状态 3、暂停状态 4、停止状态 5、销毁状态
启动:
public void startActivity(Intent intent)
Intent intent = new Intent(MainActivity.this,secoundActivity.class);
startActivity(intent);
关闭:
public void finish()
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new Voew.OnClickListener()I
@Override
public void onClick(View v){
finish(); //关闭当前的activity
});
1、显式Intent :直接指定目标组件。 实现代码:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
第一个参数 this 表示当前Activity,第二个参数SecondActivity.class表示要跳转到的目标Activity。
2、隐式Intent :不会明确指出需要激活的目标组件,它被广泛应用在不同应用程序之间,进行消息传递。 实现代码:
1、action属性匹配规则
2、data属性匹配规则
......
3、category属性匹配规则
......
4.4.1 Activity之间的数据传递
(1)使用Intent的putExtra()方法传递数据
(2)使用Bundle类传递数据
启动模式有4种:standard singleTop singleTask singleInstance模式,其中最常用的是standard
Activity生命周期有5种状态,启动状态、运行状态、暂停状态、停止状态、销毁状态,Fragment生命周期也有着几种状态。
因为Fragment是被嵌入Activity中使用的,所有它的生命周期的状态直接接受其所属的Activity的生命周期状态影响。1、当在Activity中创建Fragment时,Fragment处于启动状态;2、当Activity被暂停时,其中所有的Fragment也被暂停;3、当一个Activity处于运行状态时,可单独地对每一个Fragment进行操作,如添加或删除,当进行添加操作时,Fragment处于启动状态;4、当进行删除操作时,Fragment处于销毁状态。
1、内部存储
FileOutPutStream fos = openFileOutPut(String name, int mode);
FileInputStream fis = openFileInput(String name);
mode表示文件的操作模式。有4种取值:
2、外部存储:动态申请权限
概念:它可以存储应用程序中大量数据,并对数据进行管理和维护。
重要的两个类:SQLiteOpenHelper类,SQLiteDatabase类
• 内容提供者(ContentProvider)是Android系统四大组件 之一,用于保存和检索数据,是Android系统中不同应 用程序间共享数据的接口。
• ContentProvider(数据提供者)是应用程序之间共 享数据的一种接口机制,是一种更为高级的数据共享 方法,可以指定需要共享的数据,而其它应用程序则 则可在不知道数据来源、路径的情况下,对共享数据 进行查询、添加、删除和更新等操作。
• 在Android系统中,许多Android系统内置的数据也是 通过ContentProvider提供给用户使用,例如通讯录、 音视频文件和图像文件等。
工作原理:
数据模型:ContentProvider 使用基于数据库模型的简单表格来提供需要共享的数据,在该表格中,每一行表示一条记录,而每一列代表特定类型和含义的数据,并且其中每一条数据记录都包含一个名为“_ID”的字段类标识每条数据。
Uri:由3部分组成,scheme authority path
•若应用程序需要实时监听ContentProvider共享的数据是否发生变化,可使用Android系统提供的内容观察者(ContentObserver)。
•内容观察者(ContentObserver)用于观察指定Uri所代表的数据 的变化,当ContentObserver观察到指定Uri代表的数据发生变化 时,就会触发onChange()方法,此时在onChange()方法中使用 ContentResovler可以查询到变化的数据。
•要使用ContentObserver观察数据变化,就必须在ContentProvider 的delete()、insert()、update()方法中调用ContentResolver的 notifyChange()方法。
工作原理:
动态注册:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver = new MyBroadcastReceiver(); //实例化广播接收者
// 实例化过滤器并设置要过滤的广播
String action = "android.Telephony.SMS_RECEIVED";
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);
registerReceiver(receiver, intentFilter); // 注册广播
}
@Override
protected void onDestrpy(){
super.onDestroy();
unregisterReceiver(receiver); // 当Activity销毁时注销广播接收者
}
静态注册: 在 AndroidManifest.xml 中
无序广播:无序广播是完全异步执行,发送广播时所有监听这个广播的广播接收者都会接收到此消息,但接收的顺序不确定。
有序广播:按照接收者的优先级接收,只有一个广播接收者能接收消息,在此广播接收者中逻辑执行完毕后,才会继续传递。
如果想要拦截一个有序广播,则必须在优先级较高的广播接收者中拦截接收到的广播。添加abortBroadcast()方法拦截广播。
Service(服务)是Android四大组件之一,能够在后台长时间执行操 作并且不提供用户界面的应用程序组件。Service可以与其他组件进行交互,一般是由Activity启动,但是并不依赖于Activity。当 Activity的生命周期结束时,Service仍然会继续运行,直到自己的生命周期结束为止。
Service通常被称为“后台服务”,其中“后台”一词是相对于前台而言,具体是指其本身的运行并不依赖于用户可视的UI界面,除此之外,Service还具有较长的时间运行特性。他的应用场景主要有两个,分别是后台运行和跨进程访问。
使用不同的方法启动服务,其生命周期也是不同的。
startService()方法启动服务,服务会长期的在后台运行,并且服务的状态与开启者的状态没有关系,即使启动服务的组件已经被销毁,服务会依旧运行。
在Android系统中,服务的通信方式有两种,一种是本地服务通信,一种是远程服务通信。
本地服务通信是指应用程序内部的通信,而远程服务通信是指两个应用程序之间的通信。
使用这两种方式进行通信时必须满足一个前提,就是服务必须以绑定方式开启。
远程服务通信是通过AIDL(Android Interface Definition Language)实现的,它是一种接口定义语言 (Interface Definition Language),其语法格式非常简单,与Java中定义接口很相似,但是存在几点差异,具体如下:
数据传递
在Android系统中,进程间传递的数据包括:
通过标准的Java类HttpURLConnection便可实现基于URL的请求及响应功能。
URL url = new URl("http://www.itcast.cn"); //在URL构造方法中传入要访问资源的路径
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET"); //设置请求方式
conn.setConnectTimeout(5000); //设置超时时间
InputStream is = conn.getInputStream(); //获取服务器返回的输入流
conn.disconnect(); //关闭http连接
以实体的方式得到请求URL指向的的资源信息,它向服务器提交的参数跟在请求URL后面。使用GET方式访问网络URL的内容一般要小于1024字节。
提交的数据以键值对的形式封装在请求实体中,用户通过浏览器无法看到发生的请求数据,因此POST方式比GET方式相对安全。
对象结构 以 " { " 开始 以 " } " 结束
数组结构 以 " [ " 开始 以 " ] " 结束
需要注意的是:如果使用JSON存储单个数据(如"abc"),一定要使用数组结构,不要使用对象结构。因为对象结构必须是“键的名称:值”的形式。另外,JSON文件的扩展名为.json。
使用JSONObject类解析对象结构的JSON数据
JSONObject jsonObj = new JSONObject(jo=son1);
Sreing name = jsonObj.optString("name");
int age = jsonObj.optInt("age");
boolean married = jsonObj.optBoolean("married");
使用JSONArray类解析数组结构的JSON数据
JSONArray jsonArray = new JSONArray(json2);
for(int i=0 ;i < jsonArray.length() ; i++){
JSONObject jsonObj = jsonArray.getJSONObject(i);
String name = jsonObj.optString("name");
int age = jsonObj.opyInt("age");
}
使用GSON库解析对象结构的JSON数据
Gson gson = new Gson();
Person1 person = gson.fromJson(json1,Person1.class);
使用GSON库解析数组结构的JSON数据
Gson gson = new Gson();
Type listType = new TypeToken>(){}.getType();
List person2 = gson.fromJson(json2,listType);
Handler是一种异步回调机制,主要负责与子线程进行通信。
Handler机制主要包括四个关键对象:
Handler消息机制是通过上述四个关键对象的配合使用而完成的。在UI线程中创建Handler对象,并通过该对象的sendMessage()方法发送消息到MessageQueue中,接着通过Looper调用loop()方法不断的从MessageQueue中获取消息,并分发到Handler中,最终通过Handler的handleMessage()方法处理获取的消息。
MediaPlayer类用于播放音频和视频文件,该类提供了全面的方法支持多种格式的音频文件(3gp、mp4)
SoundPool即音频池,可以同时播放多个短小的音频,而且占用的资源比较少,他适合在应用程序中播放按键音或者消息提示音等。
VideoView控件是播放视频用的,借助它可以完成一个简易的视频播放器。
MediaPlayer可以播放视频,只不过它在播放视频时没有图像输出,因此需要使用SurfaceView组件展现图像。与VideoView相比,这种方式更易于扩展。
SurfaceView组件继承自View,用于显示图像的组件。SurfaceView最大的特点就是它的双缓冲技术,所谓的双缓冲技术是在它内部有两个线程。