代碼部分:
part1:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="insert"
android:text="insert" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="delete"
android:text="delete" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="update"
android:text="update" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="query"
android:text="query" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
效果圖:
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver();
}
/**
* 演示ContentProvider的插入操作
* @param view
*/
public void insert(View view) {
/*
* content://bzxy.day13.demo/teacher
* */
// 定義Uri
Uri uri = Uri.parse("content://bzxy.day13.demo/teacher");
// 定義ContentValues
ContentValues contentValues = new ContentValues();
contentValues.put("name", "李老師");
Uri result = contentResolver.insert(uri, contentValues);
long id = ContentUris.parseId(result);
Toast.makeText(this,"插入完成,插入數據的id是:" + id, Toast.LENGTH_SHORT).show();
}
/**
* 演示ContentProvider的刪除操作
* @param view
*/
public void delete(View view) {
Uri uri = Uri.parse("content://bzxy.day13.demo/teacher");
int row = contentResolver.delete(uri, "id=?", new String[]{"1"});
Toast.makeText(this, "刪除的數據條數是:" + row, Toast.LENGTH_SHORT).show();
}
/**
* 演示ContentProvider的修改操作
* @param view
*/
public void update(View view) {
Uri uri = Uri.parse("content://bzxy.day13.demo/student");
ContentValues contentValues = new ContentValues();
contentValues.put("name", "王五");
int row = contentResolver.update(uri,contentValues,"id=?", new String[]{"3"});
Toast.makeText(this, "更新的數據條數是:" + row, Toast.LENGTH_SHORT).show();
}
/**
* 演示ContentProvider的查詢操作
* @param view
*/
public void query(View view) {
Uri uri = Uri.parse("content://bzxy.day13.demo/student");
Cursor cursor = contentResolver.query(uri,null,null,null,null);
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.i(TAG, "學生的id是:"+id+",姓名是:" + name);
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.day13">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name=".MyContentProvider"
android:authorities="bzxy.day13.demo"
android:exported="true" />
</application>
</manifest>
DBHelper.java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "demo";
private static final int VERSION = 2;
public DBHelper(@Nullable Context context) {
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table if not exists student(id integer primary key autoincrement, name varchar not null)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1 && newVersion == 2) {
String sql = "create table if not exists teacher(id integer primary key autoincrement, name varchar not null)";
db.execSQL(sql);
}
}
}
MyContentProvider.java
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* 自定義ContentProvider
*/
public class MyContentProvider extends ContentProvider {
private DBHelper dbHelper;
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 配置UriMatcher
static {
uriMatcher.addURI("bzxy.day13.demo", "student", 1);
uriMatcher.addURI("bzxy.day13.demo", "teacher", 2);
}
@Override
public boolean onCreate() {
dbHelper = new DBHelper(getContext());
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteDatabase database = dbHelper.getReadableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case 1:
cursor = database.query("student", projection, selection, selectionArgs, null, null, sortOrder);
break;
case 2:
cursor = database.query("teacher", projection, selection, selectionArgs, null, null, sortOrder);
break;
default:
break;
}
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
SQLiteDatabase database = dbHelper.getWritableDatabase();
long id = 0;
switch (uriMatcher.match(uri)) {
case 1:
id = database.insert("student",null, values);
break;
case 2:
id = database.insert("teacher",null, values);
break;
default:
break;
}
Uri newUri = ContentUris.withAppendedId(uri, id);
database.close();
return newUri;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
SQLiteDatabase database = dbHelper.getWritableDatabase();
int row = 0;
switch (uriMatcher.match(uri)){
case 1:
row = database.delete("student", selection, selectionArgs);
break;
case 2:
row = database.delete("teacher", selection, selectionArgs);
break;
default:
break;
}
database.close();
return row;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
SQLiteDatabase database = dbHelper.getWritableDatabase();
int row = 0;
switch (uriMatcher.match(uri)) {
case 1:
row = database.update("student", values, selection, selectionArgs);
break;
case 2:
row = database.update("teacher", values, selection, selectionArgs);
break;
default:
break;
}
database.close();
return row;
}
}
part2:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="insert"
android:text="insert" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="delete"
android:text="delete" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="update"
android:text="update" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="query"
android:text="query" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
效果圖:
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver();
}
/**
* 演示插入操作
* @param view
*/
public void insert(View view) {
}
/**
* 演示刪除操作
* @param view
*/
public void delete(View view) {
}
/**
* 演示更新操作
* @param view
*/
public void update(View view) {
}
/**
* 演示查詢操作
* @param view
*/
public void query(View view) {
Uri uri = Uri.parse("content://bzxy.day13.demo/teacher");
Cursor cursor = contentResolver.query(uri,null,null,null,null);
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.i("demo", "老師的id是:"+id+",姓名是:" + name);
}
}
}
part3:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:onClick="sendBroadcast"
android:text="發送廣播"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:onClick="showLocalBroadcast"
android:text="演示本地廣播"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:onClick="showRefresh"
android:text="通過廣播進行列表刷新"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button2" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果圖:
MyBroadcastReceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
/**
* 接收到廣播的時候觸發
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接收到廣播了", Toast.LENGTH_SHORT).show();
}
}
MyReceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "廣播接收到了", Toast.LENGTH_SHORT).show();
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.day13_broadcast">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".RefreshActivity"></activity>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <!-- 廣播註冊 -->
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="bzxy.day13.demo" />
</intent-filter>
</receiver>
</application>
</manifest>
效果圖:
點擊發送廣播
part4:
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
/*
* 什麼是廣播:對於Activity來講,觸發只能是一對一,做不到一對多。廣播可以彌補Activity的缺陷,做到消息的
* 一對多傳遞。
* 應用場景:非常廣闊,應用於監聽數據變化等等。
* 實現廣播:
* 1.廣播
* 2.觸發:凡是可以觸發事件的地方,都可以觸發廣播
* 3.訂閱廣播
* 廣播訂閱:
* 1.動態訂閱
* 2.靜態訂閱
* 廣播的分類
* 1.系統廣播
* 2.自定義廣播
* 2.1順序廣播
* 2.2正常廣播
* 3.本地廣播(如果只是在本app中進行廣播的話,建議使用本地廣播)
* */
private MyBroadcastReceiver myBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 訂閱廣播
// myBroadcastReceiver = new MyBroadcastReceiver();
// IntentFilter filter = new IntentFilter();
// filter.addAction("bzxy.day13.demo");
// registerReceiver(myBroadcastReceiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消訂閱
// unregisterReceiver(myBroadcastReceiver);
}
/**
* 發送廣播
* @param view
*/
public void sendBroadcast(View view) {
Intent intent = new Intent();
// intent.setAction("bzxy.day13.demo"); // 廣播的標識 day13_broadcast
ComponentName componentName = new ComponentName("com.example.day13_broadcast",
"com.example.day13_broadcast.MyReceiver");
intent.setComponent(componentName);
sendBroadcast(intent);
}
/**
* 演示本地廣播
* @param view
*/
public void showLocalBroadcast(View view) {
}
public void showRefresh(View view) {
Intent intent = new Intent(this, RefreshActivity.class);
startActivity(intent);
}
}
activity_refresh.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RefreshActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果圖:
DBHelper.java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "demo";
private static final int VERSION = 1;
public DBHelper(@Nullable Context context) {
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table if not exists user (id integer primary key autoincrement, name varchar not null)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
User.java
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
user_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="47dp"
android:layout_marginLeft="47dp"
android:layout_marginTop="35dp"
android:text="TextView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="35dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="23dp"
android:layout_marginEnd="23dp"
android:layout_marginRight="23dp"
android:text="刪除"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果圖:
RefreshAdapter
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;
public class RefreshAdapter extends BaseAdapter {
private List<User> data;
private Context context;
private LayoutInflater inflater;
public RefreshAdapter(List<User> data, Context context) {
this.data = data;
this.context = context;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder ;
if (convertView == null) {
convertView = inflater.inflate(R.layout.user_item, null);
viewHolder = new ViewHolder();
viewHolder.tv_id = convertView.findViewById(R.id.tv_id);
viewHolder.tv_name = convertView.findViewById(R.id.tv_name);
viewHolder.btn_delete = convertView.findViewById(R.id.btn_delete);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final User user = data.get(position);
viewHolder.tv_id.setText(user.getId()+"");
viewHolder.tv_name.setText(user.getName());
viewHolder.btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 刪除數據
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase database = dbHelper.getWritableDatabase();
int row = database.delete("user", "id=?", new String[]{user.getId()+""});
// 發送廣播
Intent intent = new Intent();
intent.setAction("user.delete");
context.sendBroadcast(intent);
}
});
return convertView;
}
class ViewHolder {
public TextView tv_id;
public TextView tv_name;
public Button btn_delete;
}
}
RefreshActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class RefreshActivity extends AppCompatActivity {
private DBHelper dbHelper;
private List<User> data;
private RefreshAdapter adapter;
private UserDeleteBroadcast userDeleteBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_refresh);
dbHelper = new DBHelper(this);
SQLiteDatabase database = dbHelper.getWritableDatabase();
// 準備數據
for(int i=0; i<10; i++) {
ContentValues contentValues = new ContentValues();
contentValues.put("name", "張三"+i);
database.insert("user", null, contentValues);
}
getData();
// 初始化ListView
ListView listView = findViewById(R.id.listView);
adapter = new RefreshAdapter(data, this);
listView.setAdapter(adapter);
// 註冊廣播
userDeleteBroadcast = new UserDeleteBroadcast();
registerReceiver(userDeleteBroadcast,new IntentFilter("user.delete"));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(userDeleteBroadcast);
}
/**
* 創建廣播接收
*/
private class UserDeleteBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// 查詢數據庫
getData();
// 更新列表
adapter.notifyDataSetChanged();
}
}
/**
* 獲取數據
*/
private void getData() {
// 數據封裝
SQLiteDatabase database = dbHelper.getWritableDatabase();
Cursor cursor = database.query("user",null,null,null,null,null,null);
if (data != null) {
data.clear();
} else {
data = new ArrayList<>();
}
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
User user = new User(id,name);
data.add(user);
}
}
}
效果圖:
點擊通過廣播進行列表刷新