该文档介绍了我在android studio开发中使用的一些常用和实用的技术,包括intent 广播机制,runOnUiThread,AlertDialog显示自定义布局文件问题,横竖屏切换保存状态onSaveInstanceState
### Android开发笔记
#### Intent 广播机制
在Android应用开发过程中,经常需要实现不同组件间的通信,其中一种常见的通信方式就是使用`Intent`广播机制。`Intent`广播是一种允许发送一个`Intent`到所有已经注册接收器的应用或组件的方式。
##### 定义继承BroadcastReceiver的广播类
在Android开发中,若希望实现组件间通信,则可以通过创建并继承`BroadcastReceiver`类的方式来完成。例如:
```java
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("com.example.WIFI_ACTION")) {
// 接收到广播后进行相应处理
// 这里可以是任何你需要执行的操作
}
}
}
```
接下来需要在应用的配置文件(如`AndroidManifest.xml`)中注册这个广播接收器或者在运行时动态注册。
##### 从Activity1通过Intent方式打开Activity2,并在打开之前注册广播
当Activity1需要向Activity2传递信息时,通常会先注册一个广播接收器,然后通过`Intent`发送数据。
```java
// Activity1中注册广播接收器
IntentFilter filter = new IntentFilter("com.example.WIFI_ACTION");
registerReceiver(myBroadcastReceiver, filter);
// 启动Activity2
Intent intent = new Intent(this, Activity2.class);
startActivity(intent);
// 发送广播
Intent broadcastIntent = new Intent("com.example.WIFI_ACTION");
sendBroadcast(broadcastIntent);
```
在Activity2中,可以通过监听特定的`Intent`来接收Activity1发送的数据。
##### Activity2中通过发送广播让Activity1执行特定功能
Activity2通过发送广播给Activity1,Activity1接收到广播后执行特定的功能。比如Activity2想要调用Activity1中的连接WiFi功能,可以通过以下方式实现:
```java
// Activity2中发送广播
Intent broadcastIntent = new Intent("com.example.WIFI_ACTION");
sendBroadcast(broadcastIntent);
```
Activity1接收到此广播后,执行连接WiFi的功能。
#### runOnUiThread
在Android应用开发中,UI线程是非常重要的,因为它负责绘制界面以及响应用户的交互事件。为了避免在非UI线程中直接更新UI元素而引起的异常,Android提供了`runOnUiThread`方法。
##### 在工作线程中访问UI控件
假设你在某个非UI线程中进行了一些耗时操作,如网络请求、数据库操作等,如果需要将结果显示在界面上,则需要使用`runOnUiThread`方法。具体实现如下:
```java
new Thread(new Runnable() {
@Override
public void run() {
// 执行耗时操作
// ...
runOnUiThread(new Runnable() {
@Override
public void run() {
// 更新UI
textView.setText("数据已更新");
}
});
}
}).start();
```
这种方式可以确保UI更新操作在主线程中执行,避免出现`CalledFromWrongThreadException`异常。
#### AlertDialog 显示自定义布局文件问题
在Android中使用`AlertDialog`显示自定义布局文件时,可能会遇到一些问题。例如,尝试在`AlertDialog`中设置自定义视图时可能会抛出异常。为了解决这个问题,可以采用以下步骤:
```java
View view = View.inflate(this, R.layout.layout_alert_dialog, null);
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.show(); // 先显示对话框
alertDialog.setContentView(view); // 再设置内容视图
```
这里的关键在于先调用`show()`方法再设置内容视图。这样可以避免抛出`AndroidRuntimeException`。
#### 横竖屏切换保存状态onSaveInstanceState
在Android应用中,为了保持用户数据的一致性,开发者需要处理屏幕旋转等导致的Activity重新创建的情况。这通常通过重写`onSaveInstanceState`和`onCreate`方法来实现。
##### 保存
在Activity被销毁前(如屏幕旋转),系统会调用`onSaveInstanceState`方法,允许开发者保存当前状态。
```java
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 保存当前状态
outState.putInt("color", color);
outState.putString("text", text);
}
```
##### 读取
当Activity重新创建时,可以在`onCreate`方法中恢复之前保存的状态。
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
int color = savedInstanceState.getInt("color");
String text = savedInstanceState.getString("text");
// 使用保存的状态
}
}
```
以上方法可以帮助开发者更好地管理应用的状态,提高用户体验。