編輯:關於android開發
現在我們的手機一般都內置有方向感應器,手機屏幕會根據所處位置自動進行橫豎屏切換(前提是未鎖定屏幕方向)。但有時我們的應用程序僅限在橫屏或者豎屏狀態下才可以運行,此時我們需要鎖定該程序Activity運行時的屏幕方向。還有就是在我們用手機觀看視頻時,隨意的進行橫豎屏切換,但播放進度不會隨著屏幕的轉換而從頭開始播放,為了實現這個功能,我們就需要在Activity轉換時對當前數據進行保存。
現在根據以上兩種需求,個人提出以下解決方案:

我們可以通過以下兩種方式實現鎖定Activity運行時屏幕的方向:
修改Android/app/mainfests/AndroidMainfest.xml下的配置文件如下:
<activity>節點的android:screenOrientation屬性可以完成該任務(portrait為保持豎屏,landscape為保持橫屏)
1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="com.example.administrator.day18"> 3 <application 4 android:allowBackup="true" 5 android:icon="@mipmap/ic_launcher" 6 android:label="@string/app_name" 7 android:supportsRtl="true" 8 android:theme="@style/AppTheme"> 9 <activity android:name=".Main2Activity" 10 //添加screenOrientation屬性(portrait為保持豎屏,landscape為保持橫屏) 11 android:screenOrientation="landscape"> 12 <intent-filter> 13 <action android:name="android.intent.action.MAIN" /> 14 15 <category android:name="android.intent.category.LAUNCHER" /> 16 </intent-filter> 17 </activity> 18 </application> 19 </manifest>
1 import android.content.pm.ActivityInfo;
2 import android.os.Bundle;
3 import android.support.annotation.Nullable;
4 import android.support.v7.app.AppCompatActivity;
5 /**
6 * Created by panchengjia on 2016/12/9.
7 */
8 public class Test extends AppCompatActivity {
9 @Override
10 protected void onCreate(@Nullable Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 setContentView(R.layout.activity_main2);
13 //添加setRequestedOrientation方法實現鎖定橫屏(portrait為保持豎屏,landscape為保持橫屏)
14 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
15 }
16 }
現在第一種需求通過修改配置文件以及java代碼的方式實現,但這裡要注意的是當同時在配置文件以及java文件中設置了方向鎖定時,系統會以配置文件設置為准(可以理解為配置文件優先級高於java代碼)
演示中,我們通過記錄按鈕的點擊次數(土司)來判斷數據是否被保存

我們發現當屏幕(Acticity)由橫屏轉為豎屏時,數據未實現保存,繼續從0開始計數點擊次數。

保存數據後,點擊數土司會繼續豎屏狀態的數據更新,而不是從零重新開始。
針對數據保存我們同樣有兩種方法實現,分別為在java代碼中使用onSaveInstanceState()方法以及在屬性。
下面我們詳細分析這兩種方法的實現:
實現代碼如下(這裡寫了Activity的全部生命周期,並打印log用於分析性能):
1 import android.support.v7.app.AppCompatActivity;
2 import android.os.Bundle;
3 import android.util.Log;
4 import android.view.View;
5 import android.widget.Toast;
6 /**
7 * Created by panchengjia on 2016/12/9.
8 */
9 public class Main2Activity extends AppCompatActivity {
10 int num=1;//初始點擊次數為1
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_main2);
15 if(savedInstanceState!=null){
16 num=savedInstanceState.getInt("data");
17 }
18 Log.i("Tag","onCreate");
19 }
20 //設置點擊事件土司記錄數據
21 public void show(View v){
22 Toast.makeText(this, num++ +"", Toast.LENGTH_SHORT).show();
23 }
24 @Override
25 protected void onSaveInstanceState(Bundle outState) {
26 super.onSaveInstanceState(outState);
27 outState.putInt("data",num);
28 Log.i("Tag","onSaveInstanceState");
29 }
30 @Override
31 protected void onStart() {
32 super.onStart();
33 Log.i("Tag","onStart");
34 }
35 @Override
36 protected void onResume() {
37 super.onResume();
38 Log.i("Tag","onResume");
39 }
40 @Override
41 protected void onRestart() {
42 super.onRestart();
43 Log.i("Tag","onRestart");
44 }
45 @Override
46 protected void onPause() {
47 super.onPause();
48 Log.i("Tag","onPause");
49 }
50 @Override
51 protected void onStop() {
52 super.onStop();
53 Log.i("Tag","onStop");
54 }
55 @Override
56 protected void onDestroy() {
57 super.onDestroy();
58 Log.i("Tag","onDestroy");
59 }
60 }
功能實現的核心代碼為protected void onSaveInstanceState(Bundle outState)方法。Activity旋轉前後的Log如下:

從Log中可以得知屏幕(Acticity)旋轉時,會銷毀之前的Activity,然後重建旋轉後的Activity。
在AndroidManifest.xml中添加configChanges屬性,如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.administrator.day18"> 4 <application 5 android:allowBackup="true" 6 android:icon="@mipmap/ic_launcher" 7 android:label="@string/app_name" 8 android:supportsRtl="true" 9 android:theme="@style/AppTheme"> 10 <activity android:name=".Main2Activity" 11 //添加configChanges屬性 12 android:configChanges="orientation|keyboard|screenSize"> 13 <intent-filter> 14 <action android:name="android.intent.action.MAIN" /> 15 16 <category android:name="android.intent.category.LAUNCHER" /> 17 </intent-filter> 18 </activity> 19 <!--<activity android:name=".Main2Activity"></activity>--> 20 </application> 21 </manifest>
在java中添加對應的onConfigurationChanged()方法用於Log打印分析,方法本身在功能實現上無實際意義:
1 @Override
2 public void onConfigurationChanged(Configuration newConfig) {
3 super.onConfigurationChanged(newConfig);
4 Log.i("Tag","onConfigurationChanged");
5 }
屏幕旋轉前後Log如下(演示兩次旋轉):

Android開發之自定義控件(二)---onLayout詳解
Android開發之自定義控件(二)---onLayout詳解 話說一個乞丐在看一個程序員寫程序,程序員遇到一個問題怎麼都解決不了,這時乞丐說
跨平台開發的兩種方法及其對比,兩種方法
跨平台開發的兩種方法及其對比,兩種方法為什麼移動應用開發對很多開發人員來說,都是一件令人頭痛的事?這是因為,每種流行的移動平台都具有自身的開發語言、開發工具及其特征。 這
Android基礎入門教程——10.11 傳感器專題(2)——方向傳感器
Android基礎入門教程——10.11 傳感器專題(2)——方向傳感器 Android基礎入門教程——10.11 傳感器專題(2)—
Android RecyclerView的使用,androidrecycler
Android RecyclerView的使用,androidrecyclerRecyclerView是什麼? RecyclerView是一種新的視圖組,目標是為任何基於