1、 为什么需要广播接收(broadcastReceiver)
[1] 想听广播必须有 :电台、有收音机、
[2] android系统内部已经定义好了电台,已经定义好了一些广播事件 外拨电话 sd状态 电池电量...
[3] 使用broadcastReceiver去接收这些已经定义好的事件
[4] 定义广播接收者的目的方便开发者进行开发
2、 广播接收者案例_ip拨号器
[1] 创建一个类继承 broadcastReceiver
public class OutGoingCallReceiver extends BroadcastReceiver
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
SharedPreferences config = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String ipNumber = config.getString("ipNumber", "");
if(resultData.startsWith("0")){
setResultData(ipNumber+resultData);
}
}
[3] 在清单里面配置
<receiver>
<intent-filter>
<action/> 这个里面注册什么事件就接收什么广播
</intent-filter>
</receiver>
<receiver android:name=".OutGoingCallReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
[3] 在清单文件中设置权相关权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
[4] 在android studio 中不设置权限不报错,但是app会不按意愿走
3、 广播接收者案例_sd卡状态监听
[1] 定义一个广播接收器
public class SdStatusReceiver extends BroadcastReceiver
<receiver android:name=".SdStatusReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<!--在获取SD卡状态的时候必须要配置data的约束-->
<data android:scheme="file"/>
</intent-filter>
4、 广播接收者案例_短信监听器
[1] 定义一个类继承BroadcastReceiver
public class SMSReceiver extends BroadcastReceiver
public void onReceive(Context context, Intent intent) {
//获取信息集合 使用的是pdu格式封装的信息,那么就需要SMSMessage来进行接收
//必须首先获取一个信息集合,然后拿出每一条来获取一条短信息,再获取数据
Object []pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus ){
SmsMessage fromPdu = SmsMessage.createFromPdu((byte[]) pdu);
String address = fromPdu.getOriginatingAddress();
Log.d("sms",address);
}
}
<receiver android:name=".SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
5、 不同版本广播的特点
[1] 在4.0以上谷歌要求 第一次安装应用必须有界面 这样广播接收者才会生效
[2] 如果用户点击了强行终止程序的运行,那么广播接收者也不会生效
[3] 在level 10 上面没有这些的安全设计
6、 广播接收者案例_卸载安装
[1] 创建一个类继承BroadcastReceiver
public class AppStateReceiver extends BroadcastReceiver
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("android.intent.action.PACKAGE_ADDED")){
Toast.makeText(context,"应用被安装了",Toast.LENGTH_LONG).show();
}else if(action.equals("android.intent.action.PACKAGE_REMOVED")){
Toast.makeText(context,"应用被卸载了",Toast.LENGTH_LONG).show();
}
}
<receiver android:name=".AppStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<!--要使这个reveiver起作用,要配置data的scheme属性-->
<data android:scheme="package"/>
</intent-filter>
</receiver>
7、 广播接收者案例_开机启动
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootCompleted">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
public class BootCompleted extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intent1 = new Intent(context, MainActivity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
}
8、 有序广播和无序广播
[1] 通过广播发出的数据一般通过getResultData()来接收,而通过Intent发送的数据一般使用intent.getData()来接收
[2] 有序广播可以被终止 有序广播数据可以被修改
[3] 无序广播不可以被终止,数据不可以被修改
[4] 有序广播会按照在清单文件中定义的priority的值来进行广播的传递,数值越高接收的速度越快,优先级就越高,如果在优先级高的广播接收者处调用abortBroadcast()那么以后的所有优先级低的广播接收者都接收不到,但是在发送者处,可以定义一个resultReceiver,这个receiver不用在清单文件中注册,拥有特权,在最后接收到,但是即使在优先级高处截断广播,还是会被resultReceiver接收到
[5] 发送广播
Intent intent = new Intent();
intent.setAction("com.young.test");
/*
参数说明
intent 意图
receiverPermission 接收者需要的权限
resultReceiver 最终的接收者
scheduler 一个传递Hander 不在主线程的时候使用
initialCode int: An initial value for the result code. Often Activity.RESULT_OK.
initialData String: An initial value for the result data. Often null.
initialExtras Bundle: An initial value for the result extras. Often null.
*/
sendOrderedBroadcast(intent,null,null,null,1,"发送数据",null);
public class HPriorityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
Log.d("HPriorityReceiver",resultData);
Toast.makeText(context,"HPriorityReceiver"+resultData,Toast.LENGTH_LONG).show();
}
}
screenStatueReceiver = new ScreenStatueReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screenStatueReceiver,intentFilter); //进行动态注册广播
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(screenStatueReceiver); //在activity 进行销毁的时候,进行解注册广播
}
9、 样式和主题
样式:一样作用于控件 例如 Button TextView 是为了减少代码量
主题:一般作用于Activity上,用于控制Activity的显示的界面效果 在清单文件中的Application和activity节点下更改
10、国际化
在res目录下创建values-语言代码 例如 values-zh 代表中文,当手语言环境为中文的时候加载,然后将需要显示的字符串进行翻译成相对应的语言就可以了
11、常见对话框
普通对话框 单选按钮对话框 多选按钮对话框 进度条对话框
[1] 普通对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("警告");
builder.setMessage("世界上最遥远的距离 是没有网络");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.d("positive","点击了确定按钮");
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.d("negative","点击了取消按钮");
}
});
builder.show();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("选出你最喜欢的课程");
final String [] item = new String[]{"android","java","c","c++","c#"};
//-1代表没有选中的
builder.setSingleChoiceItems(item, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String itemName = item[i];
Toast.makeText(getApplicationContext(),itemName,Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
});
builder.show();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("选出你想要学习的课程");
final String item[] = new String[]{"android","java","c","c++","c#"};
final boolean ischeck[] = new boolean[5];
builder.setMultiChoiceItems(item, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
ischeck[i] = b;
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
for(int j = 0;j < ischeck.length;j++){
if(ischeck[j]){
Log.d("选中的数据",item[j]);
}
}
}
});
builder.show();
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("正在加载ing...");
dialog.setMax(100);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
new Thread(){
public void run(){
for(int i = 0;i <= 100;i++){
dialog.setProgress(i);
SystemClock.sleep(50);
}
dialog.dismiss();
}
}.start();
dialog.show();
12、this和getApplicationContext的区别
[1] this 是Context的子类 而getApplicationContext返回的是一个Context父类。
[2] this返回的是具体的哪一个组件的上下文,而getApplicationContext返回的是应用的上下文
[3] 在需要上下文的地方如果传getApplication是正确的,那么写this也一定是正确的
13、android中的动画
[1] 帧动画
[2] view动画
[3] property 动画