您的位置:首页 > 移动开发 > Android开发

Android_黑马视频学习_day07

2017-12-25 23:52 344 查看
一、为什么需要广播接收(broadcastReceiver)

[1]有什么样的人员听广播  老人  出租车司机  寂寞的大学生  情感夜话

[2]想听广播必须的有:电台  有收音机  音乐广播
[3]Android系统内部已经定义好了电台  已经定义好了一些广播事件  比如 外拨电话 短信到来 sd状态 电池电量

[4]使用broadcastReceiver去接收系统已经定义好的这些事件

[5] javame javase javaee

[6]定义广播接收者的目的是为了方便开发者进行开发

二、广播接收者案例_ip拨号器
360永远免费 瑞星 卡巴司机 滴滴

[1]定义广播接收者  相当于你买了一个收音机

public class OutGoingCallReceiver extends BroadcastReceiver{

[2]在清单文件里面配置 相当于你安装了一块电池

<receiver android:name="com.itheima.ipdail.outGoingCallReceiver">

[3]具体调到一个合适的频道

<intent-filter >

<action android:name="android.intent.action.NEW _OUTGOING CALL"/>

</intent-filter>

[4]记得加上权限

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>


三、广播接收者案例_sd卡状态监听
[1]定义广播接受者

public class SdcardStateReceiver extends BroadcastReceiver {
//当sdcard状态发生改变的时候调用
public void onReceive(Context context, Intent intent) {
//获取到当前广播的事件类型
String action = intent.getAction();
if("android.intent.action.MEDIA_MOUNTED".equals(action)) {
System.out.print
4000
ln("说明sdcard挂载了...");
} else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)) {
System.out.println("说明sdcard卸载了...");
}

}
}


[2]在清单文件里面配置

<receiver android:name=".SdcardStateReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<!--小细节 这里需要配置一个data  约束类型必须叫file 因为sd里面存的数据类型是file-->
<data android:scheme="file"/>
</intent-filter>
</receiver>


四、广播接收者案例_短信监听器

public class SmsListenerReceiver extends BroadcastReceiver {
//当短信到来的时候执行
public void onReceive(Context context, Intent intent) {
//获取发送者的号码和内容
Object[] objects = (Object[]) intent.getExtras().get("pdus");
for(Object obj : objects) {
//[1]获取smsmessagge实例
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
//[2]获取发送短信的内容
String messageBody = smsMessage.getMessageBody();
String address = smsMessage.getOriginatingAddress();
System.out.println("body:"+messageBody+"------"+address);
}

}
}


<receiver android:name=".SmsListenerReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVER"/>
</intent-filter>
</receiver>


五、不同版本广播的特点

[1]在4.0 谷歌工程师要求  第一次安装应用的时候必须的有界面  这样广播接收者才生效

[2]在设置页面有一个强行停止的按钮  如果说用户点击了强行停止按钮  那么广播接收者也不生效

[3]在2.3的手机上没有这样的安全设计

六、广播接收者案例_卸载安装
[1]定义广播接受者

public class AppStateReceiver extends BroadcastReceiver {
//当有新的应用被安装了  或者有应用被卸载了  这个方法调用
public void onReceive(Context context, Intent intent) {
//获取当前广播事件类型
String action = intent.getAction();

if("android.intent.action.PACKAGE_INSTALL".equals(action)) {
System.out.println("应用安装了11111");
} else if ("android.intent.action.PACKAGE_ADDED".equals(action)) {
System.out.println("应用安装了22222");
} else if("android.intent.action.PACKAGE_REMOVED".equals(action)) {
System.out.println("应用卸载了33333");

}

}
}

[2]在清单文件里面注册

<receiver android:name=".AppStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_INSTALL"/>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<!--想让action事件生效 还需要配置一个data-->
<data android:scheme="package"/>
</intent-filter>
</receiver>


大数据挖掘:    偷菜 -- 校内 -- 人人    精准营销

七、广播接收者案例_开机启动
10-06 03:05: 37.766: E /AndroidRuntime (1160): java.lang.RuntimeExcept ion: Unable to start receiver com.itheima.bootreceiver.BootReceiver:

android.util.AndroidRuntimeException: _Calling startActivity () from outside of an Activity context requires theFLAGACTIVITY_NEW_TASK flag. 
Is this really what you want?

10-06 03 :05 :39.437: D/MediaScanner (1069) : prescan time: 3ms

注意 不能在广播接受者里面直接开启activity  需要添加一个标记  添加一个任务栈的标记


[1]定义广播接受者

public class BootReceiver extends BroadcastReceiver {
//当手机重新启动的时候调用
public void onReceive(Context context, Intent intent) {

//在这个方法里面开启activity
Intent intent2 = new Intent(context, MainActivity.class);
//注意 不能在广播接受者里面直接开启activity  需要添加一个标记  添加一个任务栈的标记
intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//开启activity
context.startActivity(intent2);

}
}


[2]在清单文件里面注册

<receiver android:name=".BootReceiver">
<intent-filter>
<action android
df5d
:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>


[4]记得加上权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>


八、有序广播和无序广播
(1)有序广播    类似中央发送红头文件
[1]有序广播可以被终止
[2]有序广播的数据可以被修改

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//点击按钮 发送有序广播 发大米
public void chick(View view) {
Intent intent = new Intent();
intent.setAction("com.excample.sendrice");
/**
*  intent  意图
*  receiverPermission  接收的权限
*  resultReveiver  最终的receiver
*  scheduler  handler
*  initialCode  初始码
*  initialData  初始化数据
*/
sendOrderedBroadcast(intent, null, new FinalReceiver(), null, 1, "习大大给每个村民发了1000斤大米", null);
}
}

public class FinalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//[1]获取发送广播携带的数据
String content = getResultData();
//[2]显示结果
Toast.makeText(context, "报告习大大:"+content, Toast.LENGTH_LONG).show();
}
}

public class ProvienceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//[1]获取发送广播携带的数据
String content = getResultData();
//[2]显示结果
Toast.makeText(context, "省:"+content, Toast.LENGTH_LONG).show();
//[2.1]终止广播
abortBroadcast();
//[3]修改数据
setResultData("习大大给每个村民发了500斤大米");
}
}

public class CityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//[1]获取发送广播携带的数据
String content = getResultData();
//[2]显示结果
Toast.makeText(context, "市:"+content, Toast.LENGTH_LONG).show();
//[3]修改数据
setResultData("习大大给每个村民发了200斤大米");
}
}

public class CountryReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//[1]获取发送广播携带的数据
String content = getResultData();
//[2]显示结果
Toast.makeText(context, "乡:"+content, Toast.LENGTH_LONG).show();
//[3]修改数据
setResultData("习大大给每个村民发了10斤大米");
}
}

public class NongMinReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//[1]获取发送广播携带的数据
String content = getResultData();
//[2]显示结果
Toast.makeText(context, "农民:"+content, Toast.LENGTH_LONG).show();
}
}


(2)无序广播    比如新闻联播  每天晚上7点准时开播
[1]无序广播不可以被终止
[2]数据不可以被修改

//点击按钮发送一条无序广播
public void chick(View view) {
Intent intent = new Intent();
intent.setAction("com.example.custom");
intent.putExtra("name", "新闻联播每天晚上准时开播");
sendBroadcast(intent);  //发送无序广播
}


<receiver android:name=".ReceiveCustomReceiver">
<intent-filter>
<action android:name="com.example.custom"/>
</intent-filter>
</receiver>


九、特殊广播接收者
操作特别频繁的广播时间  比如  屏幕的锁屏和解锁  电池电量的变化  这种事件的广播在清单文件里面注册无效
注册广播接受者的2种方式
[1]动态注册  通过代码方式注册

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activi ty_main) ;
//动态的去注册广播接收者
screenReceiver = new ScreenReceiver( );
//创建IntentFilter  对象
IntentFilter filter= new IntentFilter();
//添加要注册的action
filter.addAction("android.intent.action.SCREEN _OFF");
filter.addAction("android.intent.action.SCREEN _ON");
//动态注册广播接收者
registerReceiver(screenReceiver,filter) ;



protected void onDestroy() {
//当activity 销毁的时候要取消注册广播接收者
unregisterReceiver(screenReceiver);
super.onDestroy() ;

}

[2]在清单文件通过receiver tag 节点静态发布

十、样式和主题
样式:一般作用在控件上(button textview 等)    样式作用范围比较窄

主题:一般作用在activity 或者Application节点下    作用苑围比较大
共同点:定义的方式是一样的

十一、国际化
你好世界    hello world
国际化    i18n   
周杰伦    jay
林俊杰    jj
在res下创建不同国家语言环境集目录  目录是固定写法 values-en  values-zh  ... ...  
(可在IE浏览器的Internet选项查看所有国家的固定写法,win10好像没有,还是百度搜吧)

十二、常见对话框

[1] Toast
[2] 普通对话框    单选对话框    多选对话框    进度条对话框

十三、2种上下文的区别
[1]this   最终继承Context  理解子类
[2]getApplicationContext()   返回的对象是Context 对象  父类
[3]对话只能用this

十四、Android中的动画
[1]帧动画
加载一系列的图片资源
[2]view动画 补间动画
[3]属性动画
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: