跨进程数据读取
工作中经常要夸进程取数据,每次都是翻代码,今天有空,就将其模板式的记录下了。
大概思路
1.在需要暴露数据的程序A中
①建数据库
②建ContentProvider类
③注册清单文件
2.程序 B中进行获取数据。
实例:
建数据库
public class MySqlDatabase extends SQLiteOpenHelper {
public MySqlDatabase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table status_bar_tb ,(_id integer, pkgname varchar(100))");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
建ContentProvider类
public class MyContentProvider extends ContentProvider{
UriMatcher um;
static final String AUTHORITY = "com.android.status_bar";
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
return null;
}
@Override
public int delete(Uri uri, String s, String[] strings) {
return 0;
}
@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
return 0;
}
@Override
public boolean onCreate() {
um = new UriMatcher(UriMatcher.NO_MATCH);
um.addURI(AUTHORITY, "status_bar_db", 1);
return false;
}
@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
SQLiteDatabase db = getContext().openOrCreateDatabase("status_bar_db", Context.MODE_PRIVATE, null);
Cursor cursor = db.rawQuery("select * from status_bar_tb", null);
return cursor;
}
}
注册清单文件
<provider android:name="MyContentProvider"
android:authorities="com.android.status_bar"
android:exported = "true"></provider>
B程序:
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//取得ContentResolver对象
ContentResolver cr = getContentResolver();
//指定uri并指定操作哪个表
Uri uri = Uri.parse("content://com.android.status_bar/status_bar_tb");
//执行query方法返回一个结果集
Cursor cs = null;
try {
cs = cr.query(uri, null, null, null, null);
if (cursor != null) {
//遍历结果集,取出数据
while(cs.moveToNext()){
//do something
}
}
} catch (Exception e){
e.printStatckTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
存在数据库的操作,自然就要写子线程:
private void initData() {
// 1、直接new 一个线程类,传入参数实现Runnable接口的对象 (new Runnable),相当于方法二
new Thread(new Runnable() {
@Override
public void run() {
// 写子线程中的操作
}
}).start();
// 2、通过实现Runnable接口
Thread t = new Thread(new myRunnable());
t.start();
// 3、通过继承线程类实现
new myThread().start();
}
// Thread是一个类,必须继承
public class myThread extends Thread {
@Override
public void run() {
super.run();
// 写子线程中的操作
}
}
// Runnable是一个接口,需要实现
public class myRunnable implements Runnable {
@Override
public void run() {
// 写子线程中的操作
}
}
}