導航:首頁 > 操作系統 > android切屏

android切屏

發布時間:2023-04-06 18:03:35

⑴ 如何在android開發中實現屏幕切換

屏幕切換指的是在同一個Activity內屏幕間的切換,最長見的情況就是在一個FrameLayout內有多個頁面,比如一個系統設置頁面;一個個性化設置絕森頁面。android.widget.ViewAnimator類繼承至FrameLayout,ViewAnimator類的作用是為FrameLayout裡面的View切換提供動畫效果。
該類有如下幾個和動畫相關的函數:

setInAnimation:設置View進入屏幕時候使用的動畫,該函數有兩個版本,一個接受單個參數,類型為 android.view.animation.Animation,一個接受兩個參數,類型為Context和int,分別為Context對象和定義 Animation的resourceID。

setOutAnimation: 設置View退出屏凳猛幕時候使用的動畫,參數setInAnimation函數一樣。
showNext: 調用該函數來顯示FrameLayout裡面的下一個View。

多數情況下是使用ViewFlipper 是繼承至FrameLayout的,所以它是一個Layout裡面可以放置多個View。ViewFlipper可以用來指定FrameLayout內多 個View之間的切換棗宏橋效果,可以一次指定也可以每次切換的時候都指定單獨的效果。

isFlipping:用來判斷View切換是否正在進行
setFilpInterval:設置View之間切換的時間間隔
startFlipping:使用上面設置的時間間隔來開始切換所有的View,切換會循環進行
stopFlipping: 停止View切換

⑵ app開發怎樣實現橫豎屏的切換,切屏代碼

  1. 使用jQuery Mobile開發Web App-頁面切換動畫 android

  2. jQuery Mobile包含一組基於CSS3的過渡動畫(又稱轉場效果),可以應用在任何頁面或page組件切換。jQuery Mobile默認對頁面切換和返回按鈕設置了滑動(slide)效果

  3. 要設定一個特定過渡效果,只需要在鏈接上添加一個data-transition屬性,可以使用以下屬性值:<a data-transition="pop">I'll pop</a>

  4. jQuery Mobile提供了6種切換動畫:slide(滑動)、slideup(向上滑動)、slidedown(向下滑動)、pop(拋出)、fade(淡入淡出)和flip(3D翻轉)。動畫效果見這里。

注意:flip效果在大多數android瀏覽器上不能被正確渲染,因為缺少對3d css transform的支持。不幸的是android並沒有忽略flip效果,而是使用水平翻轉來替代。所以建議在android完美支持之前謹慎使用flip效果。
此外,你可以使用data-direction=」reverse」來設定反向的過渡效果,比如對slide效果(從右往左)使用data-direction=」reverse」則會變成從左往右,對pop效果(從小到大拋出)使用data-direction=」reverse」則會變成從大到小消失。

⑶ 手機怎麼切屏

切屏?原諒我不懂這個詞的意搏銀思。 ok,如果你問的是如何基尺宴截屏的話。android 4.0以上的系統都可以按住音量下加困團電源鍵來截屏,如果2.3.6系統試試按住返回鍵,再按home鍵。

編程,關於android的切屏特效問題

activity有個overridePendingTransition函數,研究一下去吧~

⑸ Android之Activity全面解析,有些知識點容易忘記

Activity作為安卓四大組件之一,是最重要也是用得最多的組件,涉及的知識點非常多,有些知識點平時開發很少用到,但在某些場景下需要特別注意,本文詳細整理了Activity涉及的知識點,供開發參考。

針對Activity可以提出很多問題,如:
Activity 的生命周期?
Activity 之間的通信方式?
Activity 各種情況下的生命周期?
橫豎屏切換時 Activity 的生命周期?
前台切換到後台,然後再回到前台時 Activity 的生命周期?
彈出 Dialog 的時候按 Home 鍵時 Activity 的生命周期?
兩個Activity之間跳轉時的生命周期?
下拉狀態欄時 Activity 的生命周期?
Activity 與 Fragment 之間生命周期比較?
Activity 的四種 LaunchMode(啟動模式)的區別?
Activity 狀態保存與恢復?
Activity的轉場動畫有哪些實現方式?
Activity的生命周期中怎麼獲取控制項寬高?
onNewIntent的執行時機?
如何連續退出多個Activity?

如何把Acitivty設置成Dialog樣式 ,android:theme="@android:style/Theme.Dialog"

關於橫豎屏切換的生命周期,對應不同的手機,由於廠商定製的原因,會有不同的效果,如設置了configChanges="orientation」在有些手機會執行各個生命周期,但有些手機卻不會執行。
網上常見的結論如下:

但實際的測試如下:

可以看出,不同廠商的手機切屏生命周期會有差異。
從API 13以上,當設備在橫豎切屏時,「屏幕尺寸」也會發生變化,因此為了杜絕切屏導致頁面銷毀重建,需要加上screenSize,使用設置4,即 android:configChanges="orientation|keyboardHidden|screenSize" .

Activity的四種狀態如下:

在activity處於paused或者stoped狀態下,如果系統內存緊張,可能會被銷毀,當重回該activity時會重建,正常返回和被回收後返回的生命周期如下:

如果是回收後返回,onCreate的參數savedInstanceState不為空。

有哪些場景會觸發onNewIntent回調呢?跟啟動模式有關,首先該Activity實例已經存在,再次啟動才可能觸發。一種情況是啟動模式是singleTask或者singleInstance,無論該activity在棧中哪個位置,都會觸發onNewIntent回調,並且把上面其他acitivity移除,另一種情況是啟動模式是singleTop或者以FLAG_ACTIVITY_SINGLE_TOP啟動,並且該activity實例在棧頂,會觸發onNewIntent,如果不在棧頂是重新創建的,不會觸發。

在實際業務開發中,往往碰到需要連續退出多個activity實例,下面整理了幾種常見方法:

● 發送特定廣播
1、在需要處理連續退出的activity注冊該特定廣播;
2、發起退出的activity發送該特定廣播;
3、接收到該廣播的activity 調用finish結束頁面。
● 遞歸退出
1、用startActivityForResult啟動新的activity;
2、前一個頁面finish時,觸發onActvityResult回調,再根據requestCode和resultCode處理是否finish,達到遞歸退出的效果。
● FLAG_ACTIVITY_CLEAR_TOP
通過intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP)啟動新activity,如果棧中已經有該實例,則會把該activity之上的所有activity關閉,達到singleTop啟動模式的效果。
● 自定義activity棧
1、自定義activity列表,新打開activity則加入棧中,關閉則移除棧;
2、需要退出多個activity時,則循環從棧中移除activity實例,並調用finish。

在討論Activity啟動模式經常提到任務棧,那到底什麼是任務棧?
任務是一個Activity的集合,它使用棧的方式來管理其中的Activity,這個棧又被稱為返回棧(back stack),棧中Activity的順序就是按照它們被打開的順序依次存放的。返回棧是一個典型的後進先出(last in, first out)的數據結構。下圖通過時間線的方式非常清晰地向我們展示了多個Activity在返回棧當中的狀態變化:

taskAffinity 任務相關性,可以用於指定一個Activity更加願意依附於哪一個任務,在默認情況下,同一個應用程序中的所有Activity都具有相同的affinity, 名字為應用的包名。當然了,我們可以為每個 Activity 都單獨指定 taskAffinity 屬性(不與包名相同)。taskAffinity 屬性主要和 singleTask 啟動模式和 allowTaskReparenting 屬性配對使用,在其他情況下沒有意義。
taskAffinity 有下面兩種應用場景:

分為顯示啟動和隱式啟動。
(1)顯示啟動
直接指定待調整的Activity類名。

(2)隱式啟動
Intent 能夠匹配目標組件的 IntentFilter 中所設置的過濾信息,如果不匹配將無法啟動目標 Activity。IntentFilter 的過濾信息有 action、category、data。
IntentFilter 需要注意的地方有以下:
● 一個 Activity 中可以有多個 intent-filter
● 一個 intent-filter 同時可以有多個 action、category、data
● 一個 Intent 只要能匹配任何一組 intent-filter 即可啟動對應 Activity
● 新建的 Activity 必須加上以下這句,代表能夠接收隱式調用
<category android:name="android.intent.category.DEFAULT" />

只要匹配一個action即可跳轉,注意的是action要區分大小寫。

規則:如果intent中有category,則所有的都能匹配到intent-filter中的category,intent中的category數量可用少於intent-filter中的。另外,單獨設置category是無法匹配activity的,因為category屬性是一個執行Action的附加信息。

intent不添加category會匹配默認的,即 「android:intent.category.DEFAULT」
如果上面例子,如果去掉intent.setAction("action_name"),則會拋出異常:

規則:類似action,但data有復雜的結構,只要匹配一個data並且與data中所有屬性都一致就能匹配到Activity,只要有1個屬性不匹配,都無法找到activity。
data的結構:

data 主要是由 URI 和 mimeType 組成的。
URI 可配置很多信息,的結構如下:

與url類似,例如:

mineType:指資源類型包括文本、圖片、音視頻等等,例如:text/plain、 image/jpeg、video/* 等

下面看下data匹配的例子:
只匹配scheme

只匹配scheme也是能匹配到activity的。

匹配scheme、host、port
將上面的data改為

匹配mineType

如果有mineType,則不能僅設置setData或setMineType了,因為setData會把mineType置為null,而setMineType會把data置為null,導致永遠無法匹配到activity,要使用setDataAndType。

使用scheme的默認值contentfile

注意該方法需要在startAtivity方法或者是finish方法調用之後立即執行,不能延遲,但可以在子線程執行。

而在windowAnimationStyle中存在四種動畫:
activityOpenEnterAnimation // 打開新的Activity並進入新的Activity展示的動畫
activityOpenExitAnimation // 打開新的Activity並銷毀之前的Activity展示的動畫
activityCloseEnterAnimation //關閉當前Activity進入上一個Activity展示的動畫
activityCloseExitAnimation // 關閉當前Activity時展示的動畫

overridePendingTransition的方式比較生硬,方法也比較老舊了,不適用於MD風格,google提供了新的轉場動畫ActivityOptions,並提供了兼容包ActivityOptionsCompat。

我們知道在onCreate和onResume裡面直接獲取到控制項寬高為0,那有什麼辦法獲取到控制項的實際寬高?只要有onWindowFocusChanged、view.post、ViewTreeObserver三種方式獲取。

當用戶點擊桌面圖標啟動APP時,背後的流程如下:

我們看到的手機桌面是Launch程序的界面,點擊應用圖標會觸發點擊事件,調用startActivity(intent),然後通過Binder IPC機制,與ActivityManagerService(AMS)通訊,AMS執行一系列操作,最終啟動目前應用,大概流程如下:

通過PackageManager的resolveIntent()收集跳轉intent對象的指向信息,然後通過grantUriPermissionLocked()方法來驗證用戶是否有足夠的許可權去調用該intent對象指向的Activity。如果有許可權,則在新的task中啟動目標activity,如果發現沒有進程,則先創建進程。

如果進程不存在,AMS會調用startProcessLocked創建新的進程,在該方法中,會通過socket的通訊方式通知zygote進程孵化新的進程並返回pid,在新的進程中會初始化ActivityThread,並依次調用Looper.prepareLoop()和Looper.loop()來開啟消息循環。

創建好進程後下一步要將Application和進程綁定起來,AMS會調用上一節創建的ActivityThread對象的bindAppliction方法完成綁定工作,該方法會發送一條BIND_APPLICATION的消息,最終會調用handleBindApplication方法處理消息,並調用makeApplication方法處理消息,載入APP的classes到內存中。

通過前面的步驟,系統已經擁有了該Application的進程,後續的啟動則是從已存在其他進程中啟動Acitivity,即調用realStartAcitvityLocked,該方法會調用Application的主線程對象ActivityThread的sheleLaunchActivity方法,在方法中會發送LAUNCH_ACTIVITY到消息隊列,最終通過handleLaunchActivity處理消息,完成Acitivty的啟動。

Activity
Activity 的 36 大難點,你會幾個?「建議收藏」
[譯]Android Application啟動流程分析

⑹ android中橫豎屏切換時,對activity的生命周期有什麼影響

橫豎屏切換時候Activity的生命周期
曾經遇到過一個面試題,讓你寫出橫屏切換豎屏Activity的生命周期。
1、新胡瞎毀建一個Activity,
2、運行Activity,
3、按crtl+f12切換成橫屏
4、再按crtl+f12切換成豎屏,發現列印了兩次相同的log
5、修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",執行步驟3
6、再執行步驟4,發現不會再列印相同信息,但多列印了一行onConfigChanged
7、把步驟5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",執行步驟3,就只列印onConfigChanged
8、執行步驟4
onConfigurationChanged-->
onConfigurationChanged-->
總結:
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏褲備時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周神運期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
總結一下整個Activity的生命周期
補充一點,當前Activity產生事件彈出Toast和AlertDialog的時候Activity的生命周期不會有改變
Activity運行時按下HOME鍵(跟被完全覆蓋是一樣的):onSaveInstanceState --> onPause --> onStop onRestart -->onStart--->onResume
Activity未被完全覆蓋只是失去焦點:onPause--->onResume

⑺ Android的 MySurfaceView 的橫 豎屏切換問題

一、禁止橫豎屏轉換
Android橫豎屏切換在手機開發中比較常見,很多軟體在開發過程中為了避免橫豎屏切換時引發不必要的麻煩,通常禁止掉橫豎屏的切換,
通過在AndroidManifest.xml中設置activity中的android:screenOrientation屬性值來實現。
比如下列設置
android:screenOrientation="portrait"
則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。
android:screenOrientation="landscape",為橫屏顯示。
上述修改也可以在java代碼中通過類似如下代碼來設置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
另外,android中每次屏幕的切換動會重啟Activity,所以應該在Activity銷毀前保存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的游戲就不會自動重啟了!

二、橫豎屏切換
如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的布局。可以通過以下兩種方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應的layout文件名不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程序為調用Activity的onCreate方法,從而載入相應的布局。
2)假如布局資源不按照如上設置,則可以通過java代碼來判斷當前是橫屏還是豎屏然後來載入相應的xml布局文件。因為當屏幕變為橫屏的時候,系統會重新呼叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml。
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE)
{
Log.i("info", "landscape"); // 橫屏
} else if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT)
{
Log.i("info", "portrait"); // 豎屏
}
三、通過onConfigurationChanged攔截橫豎屏變換
按照二的操作,Activity每次橫豎屏切換都會重新調用onPause-> onStop-> onDestory-> onCreate->onStart->onResume,為此涉及到內容和數據的保存和讀取,否則轉屏之前的內容就會消失了。很多時候這樣的結果讓程序繁瑣,為此Android提供了在manifest中設置android:configChanges屬性,從而讓Activity不延續上述的重建流程。在Android工程的Mainfest.xml中配置Activity:android:configChanges="keyboardHidden|orientation",橫豎屏切換之後就不會去執行OnCreat函數了,而是會去調用onConfigurationChanged()這樣就能控制橫豎屏的切換了。用戶可以在Activity或View的onConfigurationChanged(Configuration newConfig)函數中獲取當前橫豎屏參數。至於其調用順序跟touch時間的傳遞順序相似,不過他沒有消費事件的概念,會順次調用到每一個onConfigurationChanged函數。
需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// land do nothing is ok
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// port do nothing is ok
}
}
需要注意的是,onConfigurationChanged函數中只能獲得橫豎屏切換後的參數,在該函數中獲取不到新的Layout和控制項的尺寸位置信息,如果要處理尺寸和位置信息,必須通過消息非同步或者延時調用。
四、徹底禁止翻轉
當然如果要徹底禁止翻轉,可以設置android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應帶來的麻煩了。不過在模擬器上不管用,在真機上是正確的。
這里提一個小知識,Android模擬器中,快捷鍵"Ctrl+F11/F12"可以實現轉屏
五,自適應轉換
如果想讓它啟動的時候是橫屏的話就橫屏表示,縱屏的話就縱屏表示,然後手機切換橫豎屏就不能用了該怎麼解決呢?
首先:在Mainfest.xml中追加
android:screenOrientation="sensor" android:configChanges="orientation|keyboardHidden"
這兩個屬性。
第二步:取得屏幕的長和寬,進行比較設置橫豎屏的變數。
1. Display display = getWindowManager().getDefaultDisplay();
2. int width = display.getWidth();
3. int height = display.getHeight();
4. if (width > height) {
5. orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; //橫屏
6. } else {
7. orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; //豎屏
8. }
第三步:在onConfigurationChanged()函數中追加this.setRequestedOrientation(orientation)就行了
1. public void onConfigurationChanged(Configuration newConfig) {
2. super.onConfigurationChanged(newConfig);
3. this.setRequestedOrientation(orientation);
4. }
但是這樣的話你切到別的畫面的時候再回到原畫面,它就仍然是橫的或者是縱的。怎麼讓它從別的屏幕回來後,又重新橫豎屏布局呢?
只要在OnResume()中在設定下就行了。但是這個只支持橫豎屏只有一個layout的。橫豎屏分別對應layout的還不知道該怎麼解決。
1. protected void onResume() {
2. orientation = ActivityInfo.SCREEN_ORIENTATION_USER;
3. this.setRequestedOrientation(orientation);
4. Display display = getWindowManager().getDefaultDisplay();
5. int width = display.getWidth();
6. int height = display.getHeight();
7. if (width > height) {
8. orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
9. } else {
10. orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
11. }
12. super.onResume();
13. }
六、總結
總之,對於橫豎屏切換的問題,統計了下,大家的解決辦法是:
①不理會。。
②只豎屏顯示(android:screenOrientation="portrait")
只橫屏顯示(android:screenOrientation="landscape")
③簡單的防止重載:
在 AndroidManifest.xml中加入:android:configChanges="orientation|keyboardHidden"
在activity中重載onConfigurationChanged事件
@Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);
}
④橫豎屏分別布局
橫豎屏分別布局的方法是:
在res下新建
layout-land 橫屏
layout-port 豎屏
然後把layout中的xml文件分別考到以上目錄,修改布局就可以了代碼中不做任何更改。
在 AndroidManifest.xml文件中的 主Activity中加入
android:configChanges="orientation|keyboardHidden"
然後在主Activity中的onConfigurationChanged加入
@Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);

if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.main); //布局
tv = (TextView) findViewById(R.id.EditText01); //控制項
}

if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
setContentView(R.layout.main); //布局
tv = (TextView) findViewById(R.id.EditText01); //控制項
}
}
七、示例詳細步驟
//------ 第一步:獲得許可
需要在中添加相應許可
//------ 第二步:根據不同的目標,針對Activity進行設置
目標1:屏蔽橫豎屏的切換
步驟:為Activity設置一個默認的屏幕方向 方法如下:
在AndroidManifest.xml中找到該Activity 添加代碼:

android:name=".ActivityName"
android:screenOrientation="landscape"
>
設置Activity的默認方向為「橫向」
此處的screenOrientation有如下選項:
==================================================================
= unspecified 默認值,由系統判斷狀態自動切換
= landscape 橫屏
= portrait 豎屏
= user 用戶當前設置的orientation值
= behind 下一個要顯示的Activity的orientation值
= sensor 使用感測器 感測器的方向
= nosensor 不使用感測器 基本等同於unspecified
==================================================================
目標2:防止Activity的銷毀
步驟:為Activity設置configChanges屬性
在AndroidManifest.xml中找到該Activity 添加代碼:

android:name=".ActivityName"
android:configChanges="orientation|keyboardHidden"
>
此處的configChanges有如下選項:
==================================================================
= orientation 屏幕在縱向和橫向間旋轉
= keyboardHidden 鍵盤顯示或隱藏
= fontScale 用戶變更了首選的字體大小
= locale 用戶選擇了不同的語言設定
= keyboard 鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤
= touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件
==================================================================
如果需要多個選項 用"|"隔開
此處注意:如果是在實體機上測試橫豎屏切換 需要orientation選項
【重點】如果要使得程序可以在Android模擬器上測試 需要寫orientation|keyboardHidden
如果缺少了keyboardHidden選項 不能防止Activity的銷毀
並且在之後提到的onConfigurationChanged事件中 只能捕獲豎屏變橫屏的事件 不能捕獲橫屏變豎屏
目標3:捕獲橫豎屏切換的事件
步驟:在Activity中(ActivityName.java)重寫onConfigurationChanged事件
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
switch (newConfig.orientation)
{
//更改為LANDSCAPE
case (Configuration.ORIENTATION_LANDSCAPE):
//如果轉換為橫向屏時,有要做的事,請寫在這里
break;
//更改為PORTRAIT
case (Configuration.ORIENTATION_PORTRAIT):
//如果轉換為豎向屏時,有要做的事,請寫在這里
break;
}
}
八、備註:
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

⑻ 三星手機怎麼切屏

手機截屏是指將手機當岩神手前的頁面截取下來並保存為圖片的功能,截屏的方法瞎陵有以下幾種:1.通過快捷鍵截屏:同時按住Home鍵+電源鍵(部分早期機器需要同時按住返回鍵和Home鍵)。2.助理菜單截屏:設置-輔助功能-敏捷度和互動-助理菜單開啟-點擊屏幕上的藍色圓形加4個白色方框圖標-向下滑動-截屏;3.手勢截屏 :設置-高級功能-手掌滑動截屏-滑動開關,滑動時請保持掌沿與屏幕接觸。4.快捷圖標截屏:下拉屏幕頂簾菜單-向左滑動快捷圖標-點擊【截取屏幕】快捷圖標粗嫌即可。 5.S PEN截屏(僅限Note系列機器):將S Pen懸浮至手機屏幕上方,按下S Pen按鈕,打開浮窗指令後,點擊截屏編寫-保存即可註:不同型號手機可使用的截屏方法可能不同。

⑼ 安卓強制豎屏對pad不起作用

最近公司需要一個功能,A-Activity界面,跳轉到B-Activity界面,之後在從B返回到A,其中A界面豎屏,B界面橫屏,理論上很簡單,擼代碼一氣呵成,測試機型,完全沒有問題。
但是,在**華為棚備P20(Andorid8.1),vivo Y95(Android8.1)**卻出現閃退,B界面返回A界面後,A界面會先橫屏,之後再變為豎屏。

閃退
這個問題很奇怪,AS並沒有報任何異常,那就從另一個角度思考,開始監聽A的生命周期,列印Log發現,返回A界面時候直接走了onDestroy,也就是說A界面銷毀了,返回邏輯先銷毀A界面,再重新創建A界面,再重新創建時候資源未處理,導致界面崩潰。

android:configChanges
先來看下這個屬性:
參考:https://blog.csdn.net/Chenyongzuo/article/details/87185479
1.未設置Activity的 android:configChanges 時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2.設置Activity的 android:configChanges=「orientation」 時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
3.設置Activity的 android:configChanges=「orientation|keyboardHidden」 時,切屏不會重新調用各個生命周期,只會執行 onConfigurationChanged 方法
但是,自從Android 3.2(API 13),
在設置Activity的 android:configChanges=「orientation|keyboardHidden」 後,還是一樣會重新調用各個生命周期的。因為screen size也開始跟著設備的橫豎切換而改變。
所以,在AndroidManifest.xml里設置的MiniSdkVersion和 TargetSdkVersion屬性大於等於13的情況下,如果你想阻止程序在運行時重新載入Activity,除了設置"orientation",你還必須設置"ScreenSize"。

根據以上邏輯,唯和孫檢查代碼,發現在AndroidManifest.xml並沒有設置A界面的android:configChanges屬性,於是加上一下代碼:

android:configChanges="keyboardHidden|orientation|screenSize"
登錄後復制
崩潰問題果然沒有了,但是橫豎屏切換還是存在,繼續查閱資料。

強制豎屏無效
參考:https://blog.csdn.net/u012532674/article/details/86518312
找了半天,終於找到問題一致,機型一致,心情甭說多愉悅了,於是乎,按照博主的方法,對A、B界面進行更改,運行,測試。
問題依然存在,返回之後A界面還是會先橫屏再豎屏

A界面
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
登錄後復制
B界面
android:exported="true"
android:screenOrientation="landscape"
登錄後復制
按照指鏈博主的說法,是在B界面也就是橫屏的界面在onDestroy,加上如下代碼:

if (android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}

登錄後復制
仔細想了下,B界面返回到A界面是通過如下方式實現:

setResult();
finish();
登錄後復制
根據博主的思路,在以上代碼添加:

setResult();
finish();
if (android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
登錄後復制
運行,完美解決問題,因為項目緊,原理之後再來梳理,先實現,在重構,感謝以上兩位博主。


閱讀全文

與android切屏相關的資料

熱點內容
pr怎麼壓縮文件大小 瀏覽:861
查看oracle字元集命令 瀏覽:177
鋰電池增加密度 瀏覽:659
linux用戶密碼忘記 瀏覽:240
gb壓縮天然氣 瀏覽:633
圖片拼接不壓縮app 瀏覽:668
我的世界如何編程 瀏覽:84
vue反編譯代碼有問題 瀏覽:948
linuxshell字元串連接字元串 瀏覽:51
androidviewpager刷新 瀏覽:438
python編程計算平均分 瀏覽:678
加密數字貨幣市值查詢 瀏覽:692
時尚商圈app怎麼樣 瀏覽:584
stacklesspython教程 瀏覽:138
用命令行禁用135埠 瀏覽:212
linux防火牆編程 瀏覽:627
pdf閱讀器刪除 瀏覽:979
考研人如何緩解壓力 瀏覽:822
買電暖壺哪個app便宜 瀏覽:505
洛克王國忘記伺服器了怎麼辦 瀏覽:782