安卓学习中的一些总结(杂乱篇,日后整理)

广播

广播机制

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

接受系统广播

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

本地广播

全局广播容易存在安全隐患,为解决这个问题,引入了本地广播机制,使用这个机制的时候发出的广播只能在应用程序的内部进行传递,并且广播接收器也只能接受来自本应用程序的广播。主要是使用了一个LocalBroadcastManager来对广播进行管理  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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方法将添加到的数据提交,从而完成数据存储操作,