背景
近期各个大厂已经开始准备aosp15的系统rom适配工作了,应该是想2025年初开发发布相关的新机型,所以慢慢的我们也要开始适应aosp15版本的相关问题的修改和研究哈。
近期就有相关学员朋友在做android15相关的dialog开发时候,发现了一个严重的必现闪屏类bug。具体现象如下图所示:
明显可以看出点击dialog上按钮会正常跳转到第二个Activity,但是第二个Activity返回到第一个Activity时候就出现了必须的闪白屏的现象。
刚好千里马的学员朋友们非常期望有这样的一些窗口疑难类的bug,也刚好可以作为wms专题学习后的一些实战扩展项目给大家进行企业级别的实战哈。
闪屏问题的复现
复现环境要求:
aosp15 android-15.0.0_r3 估计其他版本也一样复现 复现demo编写:
1、编写定义一个DialogActivity,MainActivity AndroidManifest定义如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<activity
android:name=".DialogActivity"
android:exported="false"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
主要就是对 android:theme="@style/Theme.AppCompat.Dialog即可以代表这个Activity是Dialog风格的,MainActivity主要是负责跳转到DialogActivity,然后DialogActivity自己再进行跳转
2、要两个DialogActivity跳转切换
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class DialogActivity extends AppCompatActivity {
private TextView tvMessage;
private Button buttonOpenAnotherDialog;
private boolean isFirstTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 隱藏標題欄
setContentView(R.layout.activity_dialog);
// 获取传递的布尔值,默认为true
isFirstTime = getIntent().getBooleanExtra("isFirstTime", true);
initView();
buttonOpenAnotherDialog.setOnClickListener(v -> {
Intent intent = new Intent(this, DialogActivity.class);
intent.putExtra("isFirstTime", false); // 传递false表示不是第一次
startActivity(intent);
});
// 设置TextView的内容
if (isFirstTime) {
tvMessage.setText("第一次");
} else {
tvMessage.setText("第二次");
buttonOpenAnotherDialog.setVisibility(Button.INVISIBLE); // 隐藏按钮
}
}
private void initView() {
tvMessage = (TextView) findViewById(R.id.tv_message);
buttonOpenAnotherDialog = findViewById(R.id.button_open_another_dialog);
}
}
activity_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:background="@android:color/white">
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@color/black"
android:layout_marginBottom="16dp"/>
<Button
android:id="@+id/button_open_another_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open Another Dialog"/>
</LinearLayout>
3、点击跳转复现问题 复现非常简单,MainActivity点击弹出DialogActivity后,再点击DialogActivity弹出第二个DialogActivity,再返回就必现
更多framework干货内容,aosp最新实战干货,请关注下面“千里马学框架”