第一章 Android (概述)
活动:是Android应用程序的基本组件,一个活动就是一个单独的屏幕
意图:用来描述应用程序之间的功能,实现多个活动的跳转,利用消息实现应用程序之间的交互机制
服务:是Android应用程序中具有较长生命周期但没有用户界面的程序
内容提供器:提供了一种多应用间数据共享的方式
Android的优势:
系统的开放性和免费性
移动互联网的大力发展
相关厂商的大力支持
Android平台的技术架构:
Linux的内核层
中间层:程序库和Android运行时环境
应用程序框架
应用层
第二章 活动(Activity)
activity生命周期:
激活或者运行状态:当前屏幕显示
暂停状态:失去了焦点仍然对用户可见
停止状态:此活动被其他活动覆盖
终止状态:被系统清理出内存
七个方法:
onCreate()
onStart()
onRestart()
onResume()
onPasue()
onStop()
onDestroy()
完整生命周期(onCreate-onDestroy);可见生命周期(onStart-onStop);前台生命周期(onResume-onPause);
控制Activity屏幕横竖屏显示方式,设置参数“android:screenOrientation”为landscape或portrait
调用onSaveInstanceState()通常出现在:
设备锁屏
屏幕方向发生改变
按下Home键
长按Home键
第三章 用户界面
界面元素:
视图组件:TextView Button EditText Checkbox Spinner ListView
视图容器
布局管理:线性、相对、绝对、网格、表格、框架
事件处理机制:
事件(Event)
事件源(Event Source)
事件监听器(Event Listener)
Android提供了两种创建布局的方式:XML布局文件和代码直接实现
实现事件处理步骤:
创建事件监听器
在事件处理方法编写事件处理代码
在相应组件注册事件监听器
匿名方式事件处理代码
public class MainActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnYellow=(Button)this.findViewById(R.id.btnYellow);
Button btnBlue=(Button)this.findViewById(R.id.btnBlue);
btnYellow.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
getWindow().setBackgroundDrawableResource(R.color.yellow);
}
});
btnBlue.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
getWindow().setBackgroundDrawableResource(R.color.blue);
}
});
对应布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btnYellow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="黄色"/>
<Button
android:id="@+id/btnBlue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蓝色"/>
</LinearLayout>
创建Toast方法(没有焦点,显示时间有限)
调用Toast的静态方法makeText()创建一个指定文本和时长的提示信息
调用Toast的show()方法显示提示信息
Toast t1 = Toast.makeText(getApplicationContext(),"多显示一会",Toast.LENGTH_LONG);
t1.show();
对话框
AlertDialog提示对话框
ProgressDialog 进度对话框
DatePickerDialog日期选择对话框
TimePickerDialog时间选择对话框
创建提示对话框的步骤
获得AlterDialog的静态内部类的Builder对象,由该类创建对话框
通过Builder对象设置对话框的标题、按钮、以及按钮将要响应的事件
调用Builder的Create()方法创建对话框
调用Builder的show()方法显示对话框
对应代码
public class MainActivity extends AppCompatActivity {
public void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
final TextView mytv=(TextView)findViewById(R.id.tv);
Button btnDelete=(Button)findViewById(R.id.delete);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
builder.setMessage("真的要删除吗?").setPositiveButton("是",new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
mytv.setText("删除成功!");}
}).setNegativeButton("否",new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
mytv.setText("取消删除");
}
});
AlertDialog ad =builder.create();
ad.show();
}
});
}
}
对应布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"/>
</LinearLayout>
菜单
创建菜单选项:
覆盖activity的onCreateOptionsMenu()方法
调用Menu的add方法添加菜单选项(MenuItem)
当菜单选项被选择时,覆盖activity的onOptionsItemSelected()方法来响应事件
创建上下文菜单
重写activity的onCreateContextMenu()方法,调用menu的add方法添加菜单选项(MenuItem)
重写onCreateItemSelected()方法,响应菜单点击事件
在activity的onCreate()方法中,调用registerForContextMenu()方法,为视图注册上下文菜单
常用的widget组件:按钮、文本框、编辑框、复选框、单选按钮组、下拉列表
ActionBar的主要元素:图标和标题部分、ActionButton、OverFlow、ActionView、Tabs
意图(Intent)
终端用户用于开发应用程序交互功能的组件:广播接收器、意图、适配器、内容提供器
Intent由动作(action)、数据(Data)、分类(Category)、类型(Type)、组件(Component)、扩展(Extra)组成
Action属性用于描述Intent要完成的动作,对执行的动作进行一个简要描述
Data执行动作的URI和MIME类型
Category指明一个执行Action的分类
Component的属性用于指明Intent的目标组件的类的名称
Extra用于添加一些附加信息(可以利用该属性进行消息传递) --将信息存放到Extra属性有两种方式:一是直接将信息添加到Extra属性中,另一种是将数据封装到Bundle包中
显示Intent:
Inten intent=new Intent();
intent.setClass(Activity1.this,activity.class);
隐式通过Intent Filter过滤实现的
Extra属性
Intent intent=new Intent();
intent.putExtra("name","wanglibo");
意图实现跳转
MainActivity.java
public class MainActivity extends AppCompatActivity {
public void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
Button btnjump=(Button)findViewById(R.id.jump);
btnjump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
SecondActivity.java
public class SecondActivity extends Activity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button btn_back=(Button)findViewById(R.id.returnBack);
btn_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent myinten=new Intent();
myinten.setClass(SecondActivity.this,MainActivity.class);
startActivity(myinten);
SecondActivity.this.finish();
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="first activity"/>
<Button
android:id="@+id/jump"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转"
/>
</LinearLayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="second activity"/>
<Button
android:id="@+id/returnBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"/>
</LinearLayout>
实现广播和接收Intent机制步骤:
1、注册相应广播接收器,广播接收器就是接收广播消息并对消息作出响应的组件
2、发送广播,将消息内容和用于过滤的信息封装起来,广播给广播接收器
3、满足条件的广播接收器执行接受方法onReceiver()
4、销毁广播接收器。
activity的sendBroadcast()、sendOrderBroadcast()、sendStrikyBroadcast()都可以广播Intent到广播接收器
Intent的过滤机制
Intent过滤器是用来通知系统它们能够处理哪种类型隐式的 Intent对象, Activity、Service、 Broadcast Receiver能够有一个或多个 Intent过滤器。每个过滤器都描述了组件的一种能力,说明了组件将会接受的 Intent对象集。它滤如有效的期望类型的 Intent对象,滤出不想要的 Intent对象。隐式的 Intent对象仅能发送给能够通过组件的一个过滤器来传递它的一组件
一个 Intent过滤器是 IntentFilter类的实例。 Intent过滤器通常都不是用Java代码来建立的,而是在应用程序的清单文件( AndroidManifest. xml)中用< -intent-filter>元素来声明。
过滤器有类似于 Intent对象的动作、数据、和分类的字段,过滤器会用这三个域来检测个隐式的 Intent对象。对于要传递给拥有过滤器的组件的 Intent对象,必须传递所有的这三个要检测的字段。如果其中之一失败了, Android系统也不会把它发送给对应的组件-至少在基于那个过滤器的基础上不会发送
Android广播机制指的是,可以通过实现广播接收器来监听和响应这些广播的Intent。
通常广播Intent用于向监听器通知系统给事件或应用程序事件,从而扩展应用程序间的事件驱动的编程模型。
广播Intent可以使应用程序更加开放,通过使用Intent来广播一个事件,可以在不用修改原始应用程序的情况下,对事件作出响应。
Android中大量使用广播Intent来广播系统事件,如电池电量、网络连接和来电。
第五章 服务(Service)
Service提供程序的后台服务,分为本地服务和远程服务两种类型
Service特点
没有用户界面,不与用户交互
长时间运行,不占程序控制权
比Activity优先级高,不会轻易被Android系统终止,即使Service被系统终止,在系统资源恢复后Service仍将自动运行
用于进程间通信,解决两个不同进程之间的调用和通信问题
实现Service
创建一个Service类并配置
启动并绑定Service
停止Service
Service生命周期
onCreate()方法用来初始化Service,标志着Service生命周期的开始
onStart()用来启动一个Service,代表Service进入了运行状态
onDestroy()方法用来释放Service占用的资源,标志着Service生命周期的结束
Service的启动方式:
启动方式:
使用Context.startService()方法启动Service,调用者与Service没有关联,即使调用者退出,Service服务依然运行
调用Context.stopService()或Service.stopSelf()方法结束服务
启动Service的代码:
Inten inten = new Intent();
inten.setAction(".MY_SERVICE");
intent.setPackage(getPackageName());
startService(intent);
绑定方式:
通过Context.bindService()方法启动Service,调用者与Service绑定在一起,调用者一旦退出,Service服务也就终止
通过调用Context.unbindservice()解除绑定服务
Myservice 类覆盖Sevice生命周期的各个方法
public class Myservice extends Service {
public IBinder onBind(Intent intent){
Log.i("service","on bind-----");
Toast.makeText(Myservice.this,"onBind---",Toast.LENGTH_LONG).show();
return new MyBinder();
}
public void onCreate(){
Log.i("service","on create-----");
Toast.makeText(Myservice.this,"onCreate---",Toast.LENGTH_LONG).show();
}
public void onStart(Intent intent,int startId){
Log.i("service","on start-----");
Toast.makeText(Myservice.this,"onStart---",Toast.LENGTH_LONG).show();
}
public void onDestroy(){
Log.i("service","on destroy-----");
Toast.makeText(Myservice.this,"onDestroy---",Toast.LENGTH_LONG).show();
}
public class MyBinder extends Binder{
public Myservice getService(){
return Myservice.this;
}
}
}
--Android提供大量的系统服务,这些系统服务用于完成不同的功能,通过Context.getSystemService()获取不同服务管理对象
--NotificationManager类是系统的通知服务管理类,它能够将通知Notification信息显示在状态栏上
第六章 数据存储
Android数据存储方式:
Preference:是一个轻量级存储机制,适合简单数据存储,以“key-value”存储在XML文件
File:不适合结构化,适合存储较大数据
SQLite:适合移动设备中复杂数据的存储,Android已经继承了SQLite数据库,能很容易的对数据增、删、插、更,比较复杂(轻量级、独立、便于管理和维护、可移植性、语言无关、事务性)
网络:通过java.net.*和android.net.*包中的类存储于网络
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新
Content Provider是所有应用程序之间数据存储和检索的一个桥梁,其作用就是使得各个应用程序之间实现数据共享
ContentProvider:ContentProvider是不同应用程序之间进行数据交换的标准API。ContentProvider以某种Uri的形式对外提供数据,允许其它应用访问和修改数据;其它应用使用ContentResolver根据Uri去访问操作指定数据。