Android兼容性優化-Android 8.0設置Activity透明主題崩潰

2021-02-20 Android進化之路
崩潰日誌:
1 java.lang.RuntimeException:Unable to start activity ComponentInfo{com.pxwx.assistant/com.pxwx.main.ui.MainActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
2 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
3 .
4 Caused by:
5 java.lang.IllegalStateException:Only fullscreen opaque activities can request orientation
6 android.app.Activity.onCreate(Activity.java:1038)
7 androidx.core.app.ComponentActivity.onCreate(Unknown Source:0)
8 androidx.activity.ComponentActivity.onCreate(Unknown Source:0)
9 androidx.fragment.app.FragmentActivity.onCreate(Unknown Source:99)
10 androidx.appcompat.app.AppCompatActivity.onCreate(Unknown Source:10)
11 com.pxwx.base.activity.BaseActivity.onCreate(Unknown Source:0)
12 com.pxwx.main.ui.MainActivity.onCreate(Native Method)
13 android.app.Activity.performCreate(Activity.java:7183)
14 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1221)
15 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
16 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
17 android.app.ActivityThread.-wrap11(Unknown Source:0)
18 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
19 android.os.Handler.dispatchMessage(Handler.java:105)
20 android.os.Looper.loop(Looper.java:164)
21 android.app.ActivityThread.main(ActivityThread.java:6942)
22 java.lang.reflect.Method.invoke(Native Method)
23 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
24 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

拋出異常信息:

Only fullscreen opaque activities can request orientation

Android8.0源碼Activity.java:

https://www.androidos.net.cn/android/8.0.0_r4/xref/frameworks/base/core/java/android/app/Activity.java


protected void onCreate(@Nullable Bundle savedInstanceState) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);

if (getApplicationInfo().targetSdkVersion > O && mActivityInfo.isFixedOrientation()) {
final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window);
final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
ta.recycle();
//如果Activity方向固定並且是透明(或者浮動),則會拋異常。
if (isTranslucentOrFloating) {
throw new IllegalStateException(
"Only fullscreen opaque activities can request orientation");
}
}
...
}

查看ActivityInfo.java的isTranslucentOrFloating()方法:https://www.androidos.net.cn/android/8.0.0_r4/xref/frameworks/base/core/java/android/content/pm/ActivityInfo.java

//檢查Activity方式是否是透明或者是浮動的
public static boolean isTranslucentOrFloating(TypedArray attributes) {
final boolean isTranslucent =
attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent,
false);
final boolean isSwipeToDismiss = !attributes.hasValue(
com.android.internal.R.styleable.Window_windowIsTranslucent)
&& attributes.getBoolean(
com.android.internal.R.styleable.Window_windowSwipeToDismiss, false);
final boolean isFloating =
attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating,
false);

return isFloating || isTranslucent || isSwipeToDismiss;
}

解決方法:

1、降級targetSDKVersion到26以下(廢話!!)

2、移除mainfest文件裡的screenOrientation屬性

3、取消Activity主題裡的windowIsTranslucent屬性或者windowSwipeToDismiss屬性或者windowIsFloating屬性(根據你設置了什麼屬性來具體分析)

4、移除manifest文件裡的screenOrientation屬性,並在Activity的onCreate方法裡設置屏幕方向

if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

相關焦點

  • Android 8.0 Oreo 畫中畫模式
    您可以在 Manifest 文件中設置屬性,以控制大小和布局。 根 Activity 的屬性設置適用於其任務棧中的所有 Activity。 例如:如果根 Activity 已 android:resizeableActivity 設定為 true,則任務棧中的所有 Activity 都將可以調整大小。
  • Android核心主題Activity
    本文的後續內容將介紹這些主題。配置清單要使應用能夠使用 Activity,您必須在清單中聲明 Activity 及其特定屬性。聲明 Activity要聲明 Activity,請打開清單文件,並添加 <activity> 元素作為 <application> 元素的子元素。
  • Android開發樣式和主題背景
    xml version="1.0" encoding="utf-8"?為提供與 Android 4.0(API 級別 14)及更高版本的兼容性,支持庫中的樣式會針對每個版本中可用的界面屬性優化各個樣式。支持庫樣式的名稱通常與平臺樣式相似,但包含 AppCompat。要從庫或您自己的項目繼承樣式,請聲明父樣式名稱,但不帶上方所示的 @android:style/ 部分。
  • android app啟動頁(閃屏頁)白屏快速優化方案實踐
    --將頂部狀態欄設置為透明,並將界面內容布局上邊界上提至狀態欄頂部-->    <item name="android:windowTranslucentStatus">true</item>    <!
  • Android APP啟動優化
    優化APP啟動速度意義重大,啟動時間過長,可能會使用戶直接卸載APP。優化方案主要是從主題切換的方向著手:既然有這個Activity啟動界面,那能不能直接不要這個呢,當然是可以:定義一個style:<style name="AppTheme.Launcher">    <!
  • Android 狀態欄操作,你想知道的都在這裡了
    幸運的是,Android 4.4 版本開始,系統提供了相應的 API,支持狀態欄全透明化,界面 Content View 可以延伸到狀態欄上,填充狀態欄背景色。而在 Android 5.0 版本開始,系統在此基礎上做了進一步優化和規範,能夠實現動態改變狀態欄背景色,在透明度上默認呈現為半透明化,可定製化程度更高。
  • Android APP漏洞之戰——Activity漏洞挖掘詳解
    下面我們通過設置data,讓它也能響應打開網頁的Intent。run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList(3)防護策略防護策略:(1)私有Activity不應被其他應用啟動相對是安全的,創建activity時:設置exported
  • Android 12 適配簡介
    目前谷歌只提供了設置主題方式的適配方案,即使主題方式的適配,目前也必須將 TargetSdkVersion 提升到 Android 12, 即 31才能生效。或者咱慢慢等谷歌未來發布 support library。
  • Android 新出功能 ActivityResultContract
    12的同時,看android開發者掘進推送時候,發現一個新增一個我之前留意過的接口和一些類。看完下面崩潰信息,是不是覺得最終還是沒能逃過權限的問題?別急,下面我介紹你如何快速便捷的調用申請權限的接口,而且很方便的能得到用戶請求同意還是拒絕。
  • Android 啟動頁延伸至狀態欄
    設置主題和在activity中添加一句代碼:主題:這個主題你要在Manifest.xml文件裡邊配置到你的啟動頁activity<style name="FullscreenTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!
  • 來了,Android 12 適配簡介!
    目前谷歌的適配方案只提供了設置主題的方式,至於原本使用額外 Activity 作為啟動頁的方式,谷歌爸爸和藹的和我們說,你可以選擇不管或者去掉 Activity並使用設置主題方式來兼容.   implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'}創建閃屏主題,繼承Theme.SplashScreen, 設置 postSplashScreenTheme 和windowSplashScreenAnimatedIcon, 其他欄位可選
  • Android 性能優化系列之 App 啟動優化
    App的啟動過程本文所指的優化針對冷啟動。ActivityManagerService通知應用進程創建入口的Activity實例,執行它的生命周期啟動過程中Application和入口Activity的生命周期方法按如下順序調用:Application 構造方法attachBaseContext()onCreate()入口Activity的對象構造setTheme() 設置主題等信息
  • Android Activity切換動畫多種實現方式與封裝
    ="300" android:fromXDelta="100.0%p" android:toXDelta="0.0" /></set>我們最熟悉的平移動畫,用法:private void start() { startActivity(new Intent(MainActivity.this
  • Android:手把手教你如何優雅的實現APP啟動速度優化
    應用的啟動速度緩慢這是很多開發者都遇到的一個問題,比如啟動緩慢導致的黑屏,白屏問題,大部分的答案都是做一個透明的主題,或者是做一個Splash界面,但是這並沒有從根本上解決這個問題, 只是從視覺上讓用戶以為黑屏白屏問題得到了解決。那麼如何從根本上解決這個問題或者做到一定程度的緩解?
  • Android 12 已來,你的 App 崩潰了嗎?
    </intent-filter></activity>如果在包含 <intent-filter> 的 activity 、 service 或 receiver 組件中,沒有顯示聲明 android:exported 的值,你的應用將無法安裝,錯誤日誌如下所示。
  • Android啟動頁的全屏處理
    方案二:Activity的狀態欄透明化先來講一下代碼設置透明的方式,實現是沒問題的,也沒有抖動,但是狀態欄有從半透明到透明的效果,懷疑是代碼設置的速度會比較慢的原因。主題中,去掉全屏配置,只留一個Window背景為啟動圖<!
  • Android 12 來了,這些適配工作不能少
    目前谷歌的適配方案只提供了設置主題的方式,至於原本使用額外 Activity 作為啟動頁的方式,谷歌爸爸和藹的和我們說,你可以選擇不管或者去掉 Activity並使用設置主題方式來兼容.   implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'}創建閃屏主題,繼承 Theme.SplashScreen, 設置 postSplashScreenTheme 和 windowSplashScreenAnimatedIcon,
  • 關於 Android 實現滑動返回的幾種方法總結
    --新建一個主題,設置為透明樣式,保證滑動的時候能看到下面的Activity-->    <style name="JK.SwipeBack.Transparent.Theme" parent="AppTheme">        <item name="android:windowBackground">@android:color/transparent</item
  • 關於如何實現Android透明狀態欄的總結
    xml version="1.0" encoding="utf-8"?></LinearLayout>1.未做任何設置可見,Android5.0以上由於默認是Material Design,頂部是藍色狀態欄。
  • Android研發安全-Activity組件安全(上)
    WeiBo multiple Dos vulnerabilities(critical)5、Android原生的Settings應用存在必現崩潰問題(可造成拒絕服務攻擊) (涉及fragment)6、隱式啟動intent包含敏感數據,攻擊模型如下圖: