先來一個HelloWorld.
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:gravity="center">????<TextView????????android:id="@+id/tv"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="Hello?World"?/>????</LinearLayout>
事件響應代碼為將英文修改成中文。
public?class?MainActivity?extends?AppCompatActivity?{????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);//????????設置屏幕組件需要用的布局????????setContentView(R.layout.activity_main);????????TextView?tv?=?findViewById(R.id.tv);//????????修改文本控件的文字????????tv.setText("你好,世界");????} }
最后在手機上顯示的畫面如下
創建第二個頁面
在res/layout文件夾下面新建一個xml文件
在res/values的strings.xml文件中添加內容
<resources>????<string?name="app_name">OCR</string>????<string?name="text2">Activity?Main2</string></resources>
activity_main2.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:gravity="center">????<TextView????????android:id="@+id/tv2"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="@string/text2"?/></LinearLayout>
在清單文件AndroidManifest.xml文件中添加activity_main2的配置。
<?xml?version="1.0"?encoding="utf-8"?><manifest?xmlns:android="http://schemas.android.com/apk/res/android"????package="com.guanjian.ocr">????<application????????android:allowBackup="true"????????android:icon="@mipmap/ic_launcher"????????android:label="@string/app_name"????????android:roundIcon="@mipmap/ic_launcher_round"????????android:supportsRtl="true"????????android:theme="@style/Theme.OCR">????????<activity????????????android:name=".MainActivity"????????????android:exported="true"????????????android:label="@string/app_name">????????????<intent-filter>????????????????<action?android:name="android.intent.action.MAIN"?/>????????????????<category?android:name="android.intent.category.LAUNCHER"?/>????????????</intent-filter>????????</activity>????????<activity?android:name=".MainActivity2"?/>????</application></manifest>
在Activity1中添加一個按鈕來跳轉到Activity2。
<?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:gravity="center">????<TextView????????android:id="@+id/tv"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="Hello?World"?/>????<Button????????android:id="@+id/button"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="跳轉"?/></LinearLayout>
修改MainActivity的Java代碼
public?class?MainActivity?extends?AppCompatActivity?{????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);//????????設置屏幕組件需要用的布局????????setContentView(R.layout.activity_main);????????TextView?tv?=?findViewById(R.id.tv);//????????修改文本控件的文字????????tv.setText("你好,世界");????????Button?button?=?findViewById(R.id.button);//????????給button設定點擊事件的偵聽????????button.setOnClickListener(new?View.OnClickListener()?{????????????@Override????????????public?void?onClick(View?view)?{//????????????????創建一個意圖對象????????????????Intent?intent?=?new?Intent();????????????????intent.setClass(MainActivity.this,MainActivity2.class);//????????????????實現跳轉????????????????startActivity(intent);????????????} ????????});????} }
在Java主目錄中創建MainActivity2的響應類。
public?class?MainActivity2?extends?AppCompatActivity?{????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);????????setContentView(R.layout.activity_main2);????} }
在手機上的運行效果如下
Activity生命周期
上圖的說明可以見以下代碼
public?class?MainActivity?extends?AppCompatActivity?{????private?static?final?String?TAG?=?"ning";????/**?????*?在頁面載入的時候最先觸發?????*?@param?savedInstanceState?????*/????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);????????Log.d(TAG,"Activity?onCreate");//????????設置屏幕組件需要用的布局????????setContentView(R.layout.activity_main);????????TextView?tv?=?findViewById(R.id.tv);//????????修改文本控件的文字????????tv.setText("你好,世界");????????Button?button?=?findViewById(R.id.button);//????????給button設定點擊事件的偵聽????????button.setOnClickListener(new?View.OnClickListener()?{????????????@Override????????????public?void?onClick(View?view)?{//????????????????創建一個意圖對象????????????????Intent?intent?=?new?Intent();????????????????intent.setClass(MainActivity.this,MainActivity2.class);//????????????????實現跳轉????????????????startActivity(intent);????????????} ????????});????}????/**?????*?在頁面載入的時候第二個觸發?????*/????@Override????protected?void?onStart()?{????????super.onStart();????????Log.d(TAG,"Activity?onStart");????}????/**?????*?在頁面載入的時候第三個觸發,結束時頁面可見?????*/????@Override????protected?void?onResume()?{????????super.onResume();????????Log.d(TAG,"Activity?onResume");????}????/**?????*?在頁面跳轉離開的時候觸發?????*/????@Override????protected?void?onPause()?{????????super.onPause();????????Log.d(TAG,"Activity?onPause");????}????/**?????*?在頁面完全消失的時候觸發?????*/????@Override????protected?void?onStop()?{????????super.onStop();????????Log.d(TAG,"Activity?onStop");????}????/**?????*?從其他頁面返回該頁面時首次執行?????*?然后執行onStart和onResume?????*/????@Override????protected?void?onRestart()?{????????super.onRestart();????????Log.d(TAG,"Activity?onRestart");????}????/**?????*?從主界面返回安卓桌面的時候觸發?????*/????@Override????protected?void?onDestroy()?{????????super.onDestroy();????????Log.d(TAG,"Activity?onDestroy");????} }
當我們打開安卓app的時候會顯示日志
D/ning:?Activity?onCreate D/ning:?Activity?onStart D/ning:?Activity?onResume
當我們點擊跳轉按鈕會顯示日志
D/ning:?Activity?onPause D/ning:?Activity?onStop
當我們從跳轉頁面返回主界面時會顯示日志
D/ning:?Activity?onRestart D/ning:?Activity?onStart D/ning:?Activity?onResume
當我們從主界面返回安卓桌面時會顯示日志
D/ning:?Activity?onPause D/ning:?Activity?onStop D/ning:?Activity?onDestroy
當我們點擊了跳轉按鈕立刻返回主界面時會顯示日志
D/ning:?Activity?onPause D/ning:?Activity?onResume
這里有一個值得說明的地方,當App隱藏于后臺的時候,我們啟動了非常占用內存的App,比如游戲,此時安卓系統會將該進程殺死釋放內存給游戲使用。當我們再次進入該App的時候會顯示D/ning: Activity onCreate而不是D/ning: Activity onRestart。這幾個觸發動作的具體應用如下
Intent
Intent是各個組件之間信息溝通的橋梁,它用于Android各組件之間的通信,主要完成下列工作:
????????????@Override????????????public?void?onClick(View?view)?{//????????????????創建一個意圖對象,第一種方式//????????????????Intent?intent?=?new?Intent(MainActivity.this,MainActivity2.class);//????????????????第二種方式????????????????Intent?intent?=?new?Intent();????????????????intent.setClass(MainActivity.this,MainActivity2.class);//????????????????第三種方式//????????????????Intent?intent?=?new?Intent();//????????????????它可以調用第三方的控件,使用包名(字符串)和類名(字符串)來調用//????????????????ComponentName?component?=?new?ComponentName(MainActivity.this,MainActivity2.class);//????????????????intent.setComponent(component);//????????????????實現跳轉????????????????startActivity(intent);????????????}
現在我們在Activity2的頁面中添加如下的布局
<?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:gravity="center">????<TextView????????android:id="@+id/tv2"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="@string/text2"?/>????<TextView????????android:id="@+id/tv3"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:padding="5dp"????????android:text="點擊以下按鈕將向號碼12345發起請求"?/>????<Button????????android:id="@+id/btn_dial"????????android:layout_width="match_parent"????????android:layout_height="wrap_content"????????android:text="跳到撥號頁面"?/></LinearLayout>
在Activity2的Java代碼中添加
public?class?MainActivity2?extends?AppCompatActivity?implements?View.OnClickListener?{????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);????????setContentView(R.layout.activity_main2);????????findViewById(R.id.btn_dial).setOnClickListener(this);????}????@Override????public?void?onClick(View?view)?{????????switch?(view.getId())?{????????????case?R.id.btn_dial: ????????????????Intent?intent?=?new?Intent();//????????????????隱式跳轉到撥號界面????????????????intent.setAction(Intent.ACTION_DIAL);????????????????Uri?uri?=?Uri.parse("tel:12345");????????????????intent.setData(uri);????????????????startActivity(intent);????????????????break;????????????default:????????????????break;????????} ????} }
運行結果
我們在Activity的主界面的布局文件中添加如下代碼
<?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:gravity="center">????<TextView????????android:id="@+id/tv"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="Hello?World"?/>????<Button????????android:id="@+id/button"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="跳轉"?/>????<TextView????????android:id="@+id/tv_send"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="今天天氣很晴朗"?/>????<Button????????android:id="@+id/button_send"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="發送信息"?/></LinearLayout>
在Activity的Java代碼中添加
public?class?MainActivity?extends?AppCompatActivity?{????private?static?final?String?TAG?=?"ning";????private?TextView?tvSend;????/**?????*?在頁面載入的時候最先觸發?????*?@param?savedInstanceState?????*/????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);????????Log.d(TAG,"Activity?onCreate");//????????設置屏幕組件需要用的布局????????setContentView(R.layout.activity_main);????????TextView?tv?=?findViewById(R.id.tv);//????????修改文本控件的文字????????tv.setText("你好,世界");????????Button?button?=?findViewById(R.id.button);//????????給button設定點擊事件的偵聽????????button.setOnClickListener(new?View.OnClickListener()?{????????????@Override????????????public?void?onClick(View?view)?{//????????????????創建一個意圖對象,第一種方式//????????????????Intent?intent?=?new?Intent(MainActivity.this,MainActivity2.class);//????????????????第二種方式????????????????Intent?intent?=?new?Intent();????????????????intent.setClass(MainActivity.this,MainActivity2.class);//????????????????第三種方式//????????????????Intent?intent?=?new?Intent();//????????????????它可以調用第三方的控件,使用包名(字符串)和類名(字符串)來調用//????????????????ComponentName?component?=?new?ComponentName(MainActivity.this,MainActivity2.class);//????????????????intent.setComponent(component);//????????????????實現跳轉????????????????startActivity(intent);????????????} ????????});????????tvSend?=?findViewById(R.id.tv_send);????????findViewById(R.id.button_send).setOnClickListener(new?View.OnClickListener()?{????????????@Override????????????public?void?onClick(View?view)?{ ????????????????Intent?intent?=?new?Intent(MainActivity.this,MainActivity2.class);//????????????????創建一個包裹對象????????????????Bundle?bundle?=?new?Bundle();????????????????bundle.putString("request_time",?new?Date().toString());????????????????bundle.putString("request_context",tvSend.getText().toString());????????????????intent.putExtras(bundle);????????????????startActivity(intent);????????????} ????????});????}????/**?????*?在頁面載入的時候第二個觸發?????*/????@Override????protected?void?onStart()?{????????super.onStart();????????Log.d(TAG,"Activity?onStart");????}????/**?????*?在頁面載入的時候第三個觸發,結束時頁面可見?????*/????@Override????protected?void?onResume()?{????????super.onResume();????????Log.d(TAG,"Activity?onResume");????}????/**?????*?在頁面跳轉離開的時候觸發?????*/????@Override????protected?void?onPause()?{????????super.onPause();????????Log.d(TAG,"Activity?onPause");????}????/**?????*?在頁面完全消失的時候觸發?????*/????@Override????protected?void?onStop()?{????????super.onStop();????????Log.d(TAG,"Activity?onStop");????}????/**?????*?從其他頁面返回該頁面時首次執行?????*?然后執行onStart和onResume?????*/????@Override????protected?void?onRestart()?{????????super.onRestart();????????Log.d(TAG,"Activity?onRestart");????}????/**?????*?從主界面返回安卓桌面的時候觸發?????*/????@Override????protected?void?onDestroy()?{????????super.onDestroy();????????Log.d(TAG,"Activity?onDestroy");????} }
在Activity2中獲取意圖中的數據放入tv2中。
public?class?MainActivity2?extends?AppCompatActivity?implements?View.OnClickListener?{????private?TextView?tv2;????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);????????setContentView(R.layout.activity_main2);????????findViewById(R.id.btn_dial).setOnClickListener(this);????????tv2?=?findViewById(R.id.tv2);//????????從上一個頁面的意圖中獲取包裹????????Bundle?bundle?=?getIntent().getExtras();????????String?requestTime?=?bundle.getString("request_time");????????String?requestContext?=?bundle.getString("request_context");????????String?desc?=?String.format("收到請求消息:\n請求時間:%s\n請求內容:%s",????????????????requestTime,requestContext);????????tv2.setText(desc);????}????@Override????public?void?onClick(View?view)?{????????switch?(view.getId())?{????????????case?R.id.btn_dial: ????????????????Intent?intent?=?new?Intent();//????????????????隱式跳轉到撥號界面????????????????intent.setAction(Intent.ACTION_DIAL);????????????????Uri?uri?=?Uri.parse("tel:12345");????????????????intent.setData(uri);????????????????startActivity(intent);????????????????break;????????????default:????????????????break;????????} ????} }
運行結果
現在我們要回一個信息給到主界面,說今天天氣很熱。
在Activity2中增加一個按鈕,布局文件如下
<?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:gravity="center">????<TextView????????android:id="@+id/tv2"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="@string/text2"?/>????<TextView????????android:id="@+id/tv_response"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="待返回的消息為:今天天氣很熱"?/>????<Button????????android:id="@+id/btn_response"????????android:layout_width="match_parent"????????android:layout_height="wrap_content"????????android:text="發送返回信息"?/>????<TextView????????android:id="@+id/tv3"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:padding="5dp"????????android:text="點擊以下按鈕將向號碼12345發起請求"?/>????<Button????????android:id="@+id/btn_dial"????????android:layout_width="match_parent"????????android:layout_height="wrap_content"????????android:text="跳到撥號頁面"?/></LinearLayout>
現在我們在Activity的主界面的Java代碼中就不僅僅是普通的跳轉到Activity2了,而是需要注冊一個可以等待返回的ActivityResult。跳轉的方式也不再是startActivity(intent);注意,以下代碼都改成了Lambda表達式的形式,關于lambda表達式的內容可以參考Java函數式編程整理 。
public?class?MainActivity?extends?AppCompatActivity?{????private?static?final?String?TAG?=?"ning";????private?TextView?tvSend;????private?ActivityResultLauncher<Intent>?register;????/**?????*?在頁面載入的時候最先觸發?????*?@param?savedInstanceState?????*/????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);????????Log.d(TAG,"Activity?onCreate");//????????設置屏幕組件需要用的布局????????setContentView(R.layout.activity_main);????????TextView?tv?=?findViewById(R.id.tv);//????????修改文本控件的文字????????tv.setText("你好,世界");????????Button?button?=?findViewById(R.id.button);//????????給button設定點擊事件的偵聽????????button.setOnClickListener(view?->??{//????????????創建一個意圖對象,第一種方式//????????????Intent?intent?=?new?Intent(MainActivity.this,MainActivity2.class);//????????????第二種方式????????????Intent?intent?=?new?Intent();????????????intent.setClass(MainActivity.this,MainActivity2.class);//????????????第三種方式//????????????Intent?intent?=?new?Intent();//????????????它可以調用第三方的控件,使用包名(字符串)和類名(字符串)來調用//????????????ComponentName?component?=?new?ComponentName(MainActivity.this,MainActivity2.class);//????????????intent.setComponent(component);//????????????實現跳轉????????????startActivity(intent);????????});????????tvSend?=?findViewById(R.id.tv_send);//????????注冊ActivityResult,并通過回調函數獲取返回的信息????????register?=?registerForActivityResult(new?StartActivityForResult(),?result?->??{????????????if?(result?!=?null)?{ ????????????????Intent?intent?=?result.getData();????????????????if?(intent?!=?null?&&?result.getResultCode()?==?Activity.RESULT_OK)?{ ????????????????????Bundle?bundle?=?intent.getExtras();????????????????????String?responseTime?=?bundle.getString("response_time");????????????????????String?responseContext?=?bundle.getString("response_context");????????????????????String?desc?=?String.format("收到返回消息:\n返回時間:%s\n返回內容:%s",????????????????????????????responseTime,responseContext);????????????????????tv.setText(desc);????????????????} ????????????} ????????});????????findViewById(R.id.button_send).setOnClickListener(view?->??{ ????????????Intent?intent?=?new?Intent(MainActivity.this,MainActivity2.class);//????????????????創建一個包裹對象????????????Bundle?bundle?=?new?Bundle();????????????bundle.putString("request_time",?new?Date().toString());????????????bundle.putString("request_context",tvSend.getText().toString());????????????intent.putExtras(bundle);????????????register.launch(intent);????????});????}????/**?????*?在頁面載入的時候第二個觸發?????*/????@Override????protected?void?onStart()?{????????super.onStart();????????Log.d(TAG,"Activity?onStart");????}????/**?????*?在頁面載入的時候第三個觸發,結束時頁面可見?????*/????@Override????protected?void?onResume()?{????????super.onResume();????????Log.d(TAG,"Activity?onResume");????}????/**?????*?在頁面跳轉離開的時候觸發?????*/????@Override????protected?void?onPause()?{????????super.onPause();????????Log.d(TAG,"Activity?onPause");????}????/**?????*?在頁面完全消失的時候觸發?????*/????@Override????protected?void?onStop()?{????????super.onStop();????????Log.d(TAG,"Activity?onStop");????}????/**?????*?從其他頁面返回該頁面時首次執行?????*?然后執行onStart和onResume?????*/????@Override????protected?void?onRestart()?{????????super.onRestart();????????Log.d(TAG,"Activity?onRestart");????}????/**?????*?從主界面返回安卓桌面的時候觸發?????*/????@Override????protected?void?onDestroy()?{????????super.onDestroy();????????Log.d(TAG,"Activity?onDestroy");????} }
Activity2中的返回信息的代碼如下
public?class?MainActivity2?extends?AppCompatActivity?implements?View.OnClickListener?{????private?TextView?tv2;????private?final?String?msg?=?"今天天氣很熱";????@Override????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);????????setContentView(R.layout.activity_main2);????????findViewById(R.id.btn_dial).setOnClickListener(this);????????tv2?=?findViewById(R.id.tv2);//????????從上一個頁面的意圖中獲取包裹????????Bundle?bundle?=?getIntent().getExtras();????????String?requestTime?=?bundle.getString("request_time");????????String?requestContext?=?bundle.getString("request_context");????????String?desc?=?String.format("收到請求消息:\n請求時間:%s\n請求內容:%s",????????????????requestTime,requestContext);????????tv2.setText(desc);????????findViewById(R.id.btn_response).setOnClickListener(this);????}????@Override????public?void?onClick(View?view)?{ ????????Intent?intent?=?new?Intent();????????switch?(view.getId())?{????????????case?R.id.btn_dial://????????????????隱式跳轉到撥號界面????????????????intent.setAction(Intent.ACTION_DIAL);????????????????Uri?uri?=?Uri.parse("tel:12345");????????????????intent.setData(uri);????????????????startActivity(intent);????????????????break;????????????case?R.id.btn_response: ????????????????Bundle?bundle?=?new?Bundle();????????????????bundle.putString("response_time",new?Date().toString());????????????????bundle.putString("response_context",msg);????????????????intent.putExtras(bundle);????????????????setResult(Activity.RESULT_OK,intent);//????????????????頁面返回跳轉????????????????finish();????????????????break;????????????default:????????????????break;????????} ????} }
運行結果
運行時動態申請權限
|