广播就这几个步骤
1.写一个类继承BroadcastReceiver
2.配置<receiver android:name="com.itheima.sdstatus.SDCardStatusReceiver" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>动作,可以多个动作
<data android:scheme="file"></data>数据类型
<category android:name="android.intent.category.APP_GALLERY"/>
</intent-filter>
</receiver>
3.onreceiver写逻辑,intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
添加开机广播的权限android.permission.RECEIVE_BOOT_COMPLETED;
短信拦截 Object[] objs = (Object[]) intent.getExtras().get("pdus");
for(Object obj:objs){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String body = smsMessage.getMessageBody();
String sender = smsMessage.getOriginatingAddress();
System.out.println("body:"+body);
System.out.println("sender:"+sender);
abortBroadcast();
}
自定义广播
//发送自定义的广播.
Intent intent = new Intent();
intent.setAction("com.itheima.ccav.XWLB");
intent.putExtra("key", "dfafadfa");
sendBroadcast(intent);//无序广播.
自定义广播(有序)
Intent intent = new Intent();
intent.setAction("com.itheima.gov.SENDMASHROOM");
//设置优先级 priority
//setResultData//修改数据
//发送有序广播
//intent 意图
//receiverPermission 权限 默认null
//resultReceiver 结果接受者 null
//消息处理器 null 默认
// Bundle null额外的数据
//最终接受者new MyReceiver()
//sendOrderedBroadcast(intent, null, new MyReceiver(), null, 1, "你好大啊", null);
//abortBroadcast();拦截广播
代码注册广播还有个本地广播(----------)
另外写个广播事件
SCREEN_ON和SCEEN_OFF
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册广播接受者
receiver = new ScreenStatusReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
registerReceiver(receiver, filter);
}
@Override
protected void onDestroy() {
// 取消注册广播接受者
unregisterReceiver(receiver);
receiver = null;
super.onDestroy();
}
观察数据库变化
数据库操作优化
>数据库数据保存到内存中,通过内容观察者更新内存数据。
DAO通知观察者数据库变化:
context.getContentResolver().notifyChange(Uri.parse("content://com.itheima.mobilesafe.applockdb"), null); //null 代表通知所有
内容观察者监听数据库变化:
注册:
getContentResolver().registerContentObserver(Uri.parse("content://com.itheima.mobilesafe.applockdb"), true,observer); //true 代表子路径也监听
反注册:
getContentResolver().unregisterContentObserver(observer);
private class MyObserver extends ContentObserver {
public MyObserver(Handler handler) {
super(handler);
}
// 内容观察者观察到数据变化调用的方法
@Override
public void onChange(boolean selfChange) {
Log.i(TAG, "看门狗里面的内容观察者观察到了数据库变化。。。。");
lockedPacknames = dao.findAll();
super.onChange(selfChange);
}
}
>standard:默认标准模式。打开一个Activity就创建一个Activity。
>singleTop:不允许相同Activity叠加。假如栈顶已经有了,就复用,没有才创建。触发onNewIntent()方法。
>singleTask:保证任务栈里Activity的实例只有一个。如果没有就创建,如果有,就把它上面的Activity清空。 触发onNewIntent()方法。
>singleInstance:单独存在独立的任务栈。单例。触发onNewIntent()方法
自定义Toast
通过WindowManager添加自定义View到窗体
WindowManager mWM = (WindowManager) getSystemService(WINDOW_SERVICE);
//自定义View
View mView;
//设置参数
final WindowManager.LayoutParams params = mParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
//添加到窗体。
mWM.addView(view, mParams)
//移除View,注意状态,删除失败报异常
mWM..removeView(view)
补充:
params.flags
> * FLAG_LAYOUT_NO_LIMITS——没有边界限制(可移动到屏幕外)
> * FLAG_NOT_FOCUSABLE——不可获取焦点
> * FLAG_NOT_TOUCHABLE——不可触摸
> * FLAG_KEEP_SCREEN_ON——保持屏幕常亮
params.type
> * TYPE_TOAST——不可点击,不可触摸
> * TYPE_PRIORITY_PHONE——可点击可触摸,不可以显示在状态栏上
> * TYPE_SYSTEM_ERROR——可点击,可触摸,可显示在状态栏上,但是影响其他应用的亮度调节
接口回调
内部定义一个接口,有抽象方法,把这个接口当做参数,调用该方法时,要重写抽象方法,把逻辑加进去.降低了耦合性