Android应用程序通过Activity、Service、BroadcastReceiver和ContentProvider四种组件实现应用逻辑和UI交互,请写一个示例代码,并描述组件之间是如何互动
时间: 2024-02-23 07:59:42 浏览: 24
好的,以下是一个简单的 Android 应用程序示例代码,展示了如何使用 Activity、Service、BroadcastReceiver 和 ContentProvider 四种组件相互协作:
1. Activity 组件示例代码:
```java
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private MyContentObserver mContentObserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.text_view);
// 注册 ContentObserver 监听 ContentProvider 数据变化
mContentObserver = new MyContentObserver(new Handler());
getContentResolver().registerContentObserver(MyContentProvider.CONTENT_URI, true, mContentObserver);
// 启动 Service
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消注册 ContentObserver
getContentResolver().unregisterContentObserver(mContentObserver);
// 停止 Service
Intent intent = new Intent(this, MyService.class);
stopService(intent);
}
// 点击按钮发送广播
public void onClickButton(View view) {
Intent intent = new Intent();
intent.setAction(MyReceiver.ACTION);
intent.putExtra("data", "Hello, world!");
sendBroadcast(intent);
}
// 接收并显示 Service 发送的消息
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
mTextView.setText(message);
}
};
@Override
protected void onResume() {
super.onResume();
// 注册 BroadcastReceiver 监听 Service 发送的消息
IntentFilter filter = new IntentFilter();
filter.addAction(MyService.ACTION);
registerReceiver(mBroadcastReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
// 取消注册 BroadcastReceiver
unregisterReceiver(mBroadcastReceiver);
}
}
```
在这个示例代码中,我们注册了一个 ContentObserver 监听 ContentProvider 数据变化,启动了一个 Service,发送了一个广播,并注册了一个 BroadcastReceiver 监听 Service 发送的消息。
2. Service 组件示例代码:
```java
public class MyService extends Service {
public static final String ACTION = "com.example.myapp.action.MESSAGE";
private final IBinder mBinder = new MyBinder();
private Handler mHandler;
@Override
public void onCreate() {
super.onCreate();
// 创建 Handler 处理消息
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
String message = (String) msg.obj;
// 发送广播通知 Activity 更新 UI
Intent intent = new Intent();
intent.setAction(ACTION);
intent.putExtra("message", message);
sendBroadcast(intent);
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 在后台线程中执行耗时任务
new Thread(new Runnable() {
@Override
public void run() {
// 模拟耗时操作
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 发送消息更新 UI
Message message = Message.obtain();
message.obj = "Task completed!";
mHandler.sendMessage(message);
}
}).start();
// Service 被杀死后自动重启
return START_REDELIVER_INTENT;
}
@Override
public void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
}
```
在这个示例代码中,我们创建了一个 Handler 处理消息,在后台线程中执行耗时任务,并通过广播发送消息通知 Activity 更新 UI。
3. BroadcastReceiver 组件示例代码:
```java
public class MyReceiver extends BroadcastReceiver {
public static final String ACTION = "com.example.myapp.action.DATA";
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
// 存储数据到 ContentProvider
ContentValues values = new ContentValues();
values.put(MyContentProvider.COLUMN_DATA, data);
context.getContentResolver().insert(MyContentProvider.CONTENT_URI, values);
}
}
```
在这个示例代码中,我们接收了一个广播,并将数据存储到 ContentProvider。
4. ContentProvider 组件示例代码:
```java
public class MyContentProvider extends ContentProvider {
public static final Uri CONTENT_URI = Uri.parse("content://com.example.myapp.provider/mydata");
public static final String COLUMN_DATA = "data";
private MyDatabaseHelper mDatabaseHelper;
@Override
public boolean onCreate() {
mDatabaseHelper = new MyDatabaseHelper(getContext());
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
Cursor cursor = db.query("mydata", projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
long id = db.insert("mydata", null, values);
getContext().getContentResolver().notifyChange(uri, null);
return ContentUris.withAppendedId(uri, id);
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
int count = db.delete("mydata", selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
int count = db.update("mydata", values, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
```
在这个示例代码中,我们定义了一个 ContentProvider,实现了数据的增删改查,并在 insert 方法中通知 ContentObserver 数据已经发生变化。
这四种组件通过以下方式相互协作:
1. Activity 启动 Service 并发送广播,Service 在后台线程中执行耗时任务并发送消息通知 Activity 更新 UI。
2. Activity 注册 ContentObserver 监听 ContentProvider 数据变化,ContentProvider 在 insert 方法中通知 ContentObserver 数据已经发生变化。
3. BroadcastReceiver 接收广播并将数据存储到 ContentProvider。
4. ContentProvider 存储数据,并在 insert 方法中通知 ContentObserver 数据已经发生变化。