安卓通信复习
题型
选择10道*2分=20分
填空10空*2分=20分
判断10道*2分=20分
简答2道*8分=16分
程序2道*12分=24分(填空)
概念:
- Android虚拟设备的缩写:AVD
- Android SDK目前支持的操作系统是:Linux
四大组件:
- activity:用于表现功能
- service:主要用于后台运行和跨进程访问
- broadcast:接收广播
- contentprovider:多个应用中存取数据
日志工具类Log:
-
5个级别:(从低到高)
verbose、debug、info、warn、error
组件:
AlertDialog:新建AlertDialog对象,需要使用内部类Builder的build()方法,不能用new
show()方法:显示AlertDialog
create()方法:创建并显示对话框
//代码范例,帮助理解,别背
/**
* 提示对话框
*/
public void tipDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("提示:");
builder.setMessage("这是一个普通对话框,");
builder.setIcon(R.mipmap.ic_launcher);
builder.setCancelable(true); //点击对话框以外的区域是否让对话框消失
//设置正面按钮
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "你点击了确定", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
//设置反面按钮
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "你点击了取消", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
//设置中立按钮
builder.setNeutralButton("保密", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "你选择了中立", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
AlertDialog dialog = builder.create(); //创建AlertDialog对象
//对话框显示的监听事件
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Log.e(TAG, "对话框显示了");
}
});
//对话框消失的监听事件
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Log.e(TAG, "对话框消失了");
}
});
dialog.show(); //显示对话框
}
RatingBar:
android:numStars:显示多少个星星,必须为整数
android:rating:默认评分值,必须为浮点数
android:stepSize: 评分每次增加的值,必须为浮点数
MediaPlayer:播放前需要调用prepare()方法完成准备工作
EditText:编辑框的提示信息的属性是android:hint
Toast:可自定时长,单位毫秒,show()显示Toast
文件操作模式:
- MODE_PRIVATE:写入文件会被覆盖
- MODE_APPEND:追加
SharedPreferences:
- SharedPreferences是一种轻量级的数据存储方式,采用键值对的存储方式。
- 只能存储少量数据
- 存放的数据类型不支持double。
内容提供器ContentProvider:
- 作用是实现数据共享和交换,是Android实现跨程序数据共享的标准方式
- 内容URI:”content://"。例如:
content://com.example.app.provider/table1
- 可自定义ContentProvider,也可使用系统内置的,比如通讯录
- 搭配ContentResolver使用,增删查改方法都在ContentResolver对象中
事件模型:
-
基于监听接口的事件处理,模型有三个对象:事件、事件源、事件监听器
-
基于回调机制的事件处理,Android为view提供的5种事件处理的回调方法:
onKeyDown()键盘按下事件
onKeyUp()键盘抬起事件
onTouchEvent()触摸事件
onTrackBallEvent()轨迹球事件
onFocusChanged()焦点改变事件
解析XML方式:
- DOM解析
- SAX解析
- Pull解析
通信:
- Handler、runOnUiThread方法、AsyncTask等:实现不同线程间通信的机制
- Intent、文件共享、ContentProvider、Socket等:实现不同进程间通信的机制
- 在Activity中,Main线程消息队列中的消息在5秒内没有得到响应,就有可能弹出ANR对话框。
- 在BroadcastReceiver中,onReceive()方法执行时间超过10秒 ,就有可能弹出ANR对话框
广播broadcast:
-
分类:有序广播和无序广播
-
注册方式:静态注册(AndroidManifest.xml中注册)和动态注册(代码注册)
-
sendOrderBroadcast用来向系统广播有序事件,sendBroadcast用来向系统广播无序事件
-
使用abortBroadcast方法可以中断有序广播的传递,无序广播无法中断
-
注册方式的区别:
第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这种方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于像开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否则会内存泄露
通知notification:
-
需要NotificationManager来管理 Notification
(NotificationManager)getSystem(NOTIFICATION_SERVICE)
-
使用NotificationManager的notify方法显示notification消息,或者使用后台服务中的startForeground()方法
-
自定义震动:
-
方法:setVibrate()
-
权限:android.permission.VIBRATE
-
-
自定义灯光:
- 方法:setLight()
-
自定义声音:
- 方法:setSound()
-
默认震动、灯光、声音:setDefault()
-
优先级:
通知的优先级可通过setPriority()方法设置,括号中传递参数为int类型的优先级常量,例如
setPriority(NotificationCompat.PRIORITY_MAX)
将该通知的优先级设置为PRIORITY_MAX,但要注意选择合适的优先级常量,提高用户体验优先级常量有:
PRIORITY_DEFAULTPRIORITY_HIGH
PRIORITY_LOW
PRIORITY_MAX
PRIORITY_MIN
服务Service:
-
生命周期:
-
Service 有两种不同的启动模式 ,不同的启动模式对应不同生命周期.
-
(重点)Service启动模式主要分两种: 1. 启动模式 2. 绑定模式
-
启动模式:StartService
通过StartService()方法启动服务,先后调用生命周期方法onCtreat()和onstartcommand(),前者在创建服务时,只调用一次,后者可调用多次,当调用stopself()或stopService()方法时,会调用生命周期方法onDestroy()销毁服务
-
绑定模式:bindService
通过bindService()方法启动服务,先后调用生命周期方法onCtreat()和onbind(),前者在创建服务时,只调用一次,后者用于将服务和组件绑定,当调用stopself()或unbindService()方法时,会先后调用生命周期方法onUnbind()解除绑定和onDestroy()销毁服务
-
-
(重点)intentService和service:
-
Service
Service 是长期运行在后台的应用程序组件。
Service 不是一个单独的进程,它和应用程序在同一个进程中,Service 也不是一个线程,它和线程没有任何关系,所以它不能直接处理耗时操作。如果直接把耗时操作放在 Service 的 onStartCommand() 中,很容易引起 ANR .如果有耗时操作就必须开启一个单独的线程来处理
-
IntentService
IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,IntentService 会自动停止,而不需要我们去手动控制。另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。
-
服务Service课堂代码非常重要!
编程题应该是bindService
- MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
🔥 this.<Button>findViewById(R.id.button12).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button12:
//测试Service
intent=new Intent(this, LifeServiceActivity.class);
🔥 startActivity(intent);
break;
default:
}
}
}
- LifeServiceActivity
public class LifeServiceActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "LifeServiceActivity";
🔥 private ServiceConnection connection;
🔥 private ServiceLife mService;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_life_service);
findViewById(R.id.button8).setOnClickListener(this);//绑定
findViewById(R.id.button10).setOnClickListener(this);//解绑
findViewById(R.id.button11).setOnClickListener(this);//获取服务数据
🔥 intent=new Intent(LifeServiceActivity.this,ServiceLife.class);
🔥 connection=new ServiceConnection() {
/**
* 系统会调用该方法以传递服务的OnBind()方法返回的IBinder
* @param componentName
* @param iBinder OnBind()方法返回的IBinder
*/
@Override
🔥 public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.d(TAG, "onServiceConnected: 绑定成功");
ServiceLife.MyBinder mbinder= (ServiceLife.MyBinder) iBinder;
🔥 mService=mbinder.getService();
}
//系统与服务连接意外中断时调用,注意,客户端接触绑定,并不会调用该方法
@Override
🔥 public void onServiceDisconnected(ComponentName componentName) {
🔥 mService=null;
Log.d(TAG, "onServiceDisconnected: 即使解绑,也不会调用该方法,除非是系统意外中断");
}
};
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button8:
//绑定服务
Log.d(TAG, "启动服务bindService");
🔥 bindService(intent,connection, Service.BIND_AUTO_CREATE);
break;
case R.id.button10:
//解除绑定
Log.d(TAG, "停止服务unbindService");
🔥 if (mService!=null){
mService=null;
🔥 unbindService(connection);
}
break;
case R.id.button11:
//获取服务数据
if (mService!=null){
🔥 Log.d(TAG, "从服务中获取数据"+mService.getCount());
}else {
Log.d(TAG, "还未绑定服务,故无法获取服务数据");
}
break;
default:
}
}
}
- ServiceLife
/**
* 生命周期:服务与活动通信
*/
public class ServiceLife extends Service {
private static final String TAG = "ServiceLife";
private int count;
private boolean quit;
🔥 private MyBinder binder=new MyBinder();
🔥 class MyBinder extends Binder{
//通过connection可获取到Binder对象,再调用该方法即可获取到Service对象,即可实现调用该服务下的其他公共方法
ServiceLife getService(){
Log.d(TAG, "getService: 获取到了service对象");
🔥 return ServiceLife.this;
}
}
//将IBinder传给onServiceConnected方法
@Nullable
@Override
🔥 public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: 被创建了");
🔥 new Thread(new Runnable() {
@Override
public void run() {
while (!quit){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}
}).start();
}
public int getCount(){
return count;
}
@Override
🔥 public void onDestroy() {
Log.d(TAG, "onDestroy: 被销毁了");
this.quit=true;
🔥 super.onDestroy();
}
@Override
🔥 public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind: 被解绑了");
🔥 return super.onUnbind(intent);
}
}
客观题会考之前的内容
Android:在移动设备上,指操作系统,Android大致可分为四层架构:Linux内核层、系统运行库层、应用框架层和应用层
Android四大组件:活动、服务、广播接收器和内容提供器
Android日志工具Log:
Log.v( ) 打印最为琐碎、意义最小的日志消息,最低级别verbose
Log.d( ) 打印调式信息,对程序调试和问题应该有帮助,级别debug
Log.i( ) 打印重要数据,是你非常想看到的、可以帮助你分析用户行为的数据,级别info
Log.w( ) 打印警告信息,告知程序的潜在风险,建议修复,级别warn
Log.e( ) 打印错误信息,告知程序出现严重问题,必须尽快修复,最高级别,级别error
Android资源文件:
res/layout/ 存放布局文件
res/values/ 存放字符串、样式、颜色等文件
res/mipmap/ 存放图标
res/drawable/ 存放图片
.......
R.java 自动尝试,自动同步更新
UI:
Android当中基本所有的UI控件都是由View或者其子类实现的。
比如EditView,该控件中的属性inputType规定了输入的类型,常用的取值有textPassword、number、text、textEmailAddress等
布局管理:
常用布局:线性布局、相对布局、表格布局、帧布局
熟悉各个布局的定义
activity
activity的生命周期:
onCreat():表示创建,活动第一次被创建的时候调用,主要在该方法中完成活动的初始化操作,此时活动还不可见。在activity创建过程中,只执行一次。
onStar():表示启动,此时活动可见,但不在前台,不可交互。可执行多次。
onResume():表示继续、重新开始,activity可见且在前台,在活动准备好和用户进行交互时调用。此时activity进入运行状态。
onPause():表示暂停,当activity被其他activity覆盖其上或锁屏时被调用,activity可见,且还存在与内存中。常在该方法中释放一些消耗CPU的资源,以及保存一些关键数据。不能执行太过耗时的操作。进入暂停状态
onStop():表示停止,activity不可见,且还存于内存中。当activity转到新的activity界面或按Home键回到主屏,自身退居后台时,系统会调用onpause方法,再调用onstop方法,进入停止状态
onDestroy():表示销毁。activity被销毁,不可见,可在此方法中进行资源释放和回收工作。退出当前activity,即结束当前activity时,onPause→onStop→onDestroy
onRestar():表示重新开始,在活动由停止状态变成运行状态之前调用,activity被重新启动
activity向下一个页面传递参数:
通过intent的putExtra()方法实现
返回数据给上一个activity:
启动一个新的activity,并且获取这个activity的返回值用startActivityForResult()方法启动,并通过setResult()方法返回。
Intent
显示Intent
隐式intent
属性Action常用的取值:
-----activity:
ACTION_CALL 启动一个电话
ACTION_EDIT 显示用户编辑的数据
ACTION_MAIN 作为task中第一个activity启动
ACTION_SYNC 同步手机与数据服务器上的数据
------broadcast receiver
ACTION_BATTERY_LOW:电池电量过低警告。
ACTION_SCREEN_ON:屏幕变亮警告。
CONNECTIVITY_CHANGE:网络连接改变警告。
ACTION_HEADSET_PLUG:拔插耳机警告。
广播:
分类:标准广播、有序广播
注册方式:动态注册、静态注册
注册方式的区别:
第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这种方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于像开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否则会内存泄露
文件存储数据:
文件存储的路径:/data/data/<package name>/files/<文件名>
写数据:public FileOutputStream openFileOutput(String name, int mode)
读数据:public FileInputStream openFileInput(String name)
name:文件名
mode:文件操作模式,常用MODE_PRIVATE(默认):覆盖;
MODE_APPEND:追加
SharedPreferences存储:
文件存储的路径:/data/data/<package name>/shared_prefs/<文件名>
以键值对的形式存储
获取SharedPreferences对象:public SharedPreferences getSharedPreferences(String name, int mode)
SharedPreferences.Editor的putXXX方法存入文件
SharedPreferences.Editor的apply或commit方法提交文件
LitePal框架-数据库存储:
是一款开源的Android数据库框架
存储路径:/data/data/<package name>/databases/<文件名>
实体类(模型类)必须继承DataSupport才能进行CRUD操作
运行时权限:
普通权限:应用在安装时,默认自动授权
危险权限:在使用应用时,需要用到该部分的功能时才授权,拒绝仍可使用权限外的功能
共9组24个危险权限
内容提供器:
是Android实现跨程序共享数据的标准模式
内容URI:
content://com.example.app.provider/table1
表示调用方期望访问的是com.example.app这个应用的table1表中的数据。
content://com.example.app.provider/table1/1
表示调用方期望访问的是com.example.app这个应用的table1表中的id为1的数据
content://com.example.app.provider/*
表示一个能匹配任意表的内容URI
content://com.example.app.provider/table1/#
表示一个能匹配table1表中任意一行数据的内容URI