广播

广播机制

  • 标准广播与有序广播
    标准广播:完全异步执行的广播,发出后几乎所有的广播接收器在同一时刻接收到广播消息,无先后顺序可言,效率高,无法被截断
    有序广播:同步执行的广播,同一时刻只有一个广播接收器接受到,优先级高的先接收,有先后顺序,优先级高的广播接收器可截断之后的。通过在配置文件广播配置中的中的priority参数来配置优先级,通过在onReceive()中使用abortBroadcast()来阻断广播的传播

接受系统广播

  • 动态注册
    创建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法,有广播到来的时候,onReceive()就会执行,但是动态注册的广播接收器一定要都在最后取消注册
  • 静态注册 (使用AS直接创建一个广播接收器,不必自行配制)
    AndroidManifest.xml中 注册
    当使用AS创建的时候,Exported属性表示是否允许这个广播接收器接受本程序以外的广播,Enabled表示是否启用这个广播接收器

本地广播

全局广播容易存在安全隐患,为解决这个问题,引入了本地广播机制,使用这个机制的时候发出的广播只能在应用程序的内部进行传递,并且广播接收器也只能接受来自本应用程序的广播。主要是使用了一个LocalBroadcastManager来对广播进行管理  

package com.example.wean.restu;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取实例
        localBroadcastManager=LocalBroadcastManager.getInstance(this);
        Button button= (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent("com.example.wean.restu.LOCAL_BROADCAST");
                //发送本地广播
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter=new IntentFilter();
        intentFilter.addAction("com.example.wean.restu.LOCAL_BROADCAST");
        localReceiver=new LocalReceiver();
        //注册本地广播监听器
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    class LocalReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
        }
    }
}

通过LocalBroadcastManager的getInstance方法获得一个实例,注册调用registerReceiver方法,发送调用sendBroadcast方法
本地广播是无法通过静态注册的方式来接收的,也没必要

通过广播来实现强制下线功能

(源码地址) [https://github.com/Wevan/Andr]

数据存储方案

文件存储

一个简单的文件写入和读取数据应用
获取文本框输入的信息存入文件,退出程序时自动保存文本框内容到内存文件
通过openFileOutput方法能够得到一个FileOutputStream对象,然后再借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,这样就可以通过BUfferedWriter来将文本内容写入到文件了。
(可以使用Android Device Monitor打开查看文件,打开方式Tools–>Android–>目标选项,一般在/data/data/包名/files/目录,可以找到生成一个data文件,需要root权限)
读取文件到文本框,

文件存储方式并不适合存储复杂的数据

SharedPreference存储

使用键值对进行存储
* 获取SharedPreference对象的三种方法
1. Context类中的getSharedPreference()方法
此方法接受两个参数,第一个用于指定SharedPreference文件的名称,如果指定的文件不存在则会创建一个,Shared Preference都是存在/data/data/包名/shared_prefs/目录下的,第二个参数用于指定操作模式,目前只有MODE_PRIVATE这一种模式,表示只有当前这个应用程序才可以对这个SharedPreference文件进行读写
2. Activity类中的getPreferences方法
这个方法和1中很相似,不过它只接受一个操作模式参数,因为使用这个方法会自动将当前活动的类名作为SP文件名
3. Preference Manager中的getDefualtSharedPreferences方法
这是一个静态方法,他接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名
其存储步骤经过三步实现
(1) 调用SharedPreference中的edit方法来获取一个SharedPreference.Editor
(2) 向SharedPreference.Editor对象中添加数据,比如添加一个布尔类型的,putBoolean
(3) 调用apply方法将添加到的数据提交,从而完成数据存储操作,