Activity是Android應用程序的基本組件之一,它代表了一個用戶界面(UI)屏幕。每個Activity都是一個獨立的界面,用戶可以通過它與應用進行交互。一個應用程序通常由多個Activity組成,它們通過Intent進行跳轉和數據傳遞。
一個典型的Activity由以下幾個部分組成:
Activity的生命周期是指Activity從創建到銷毀的整個過程。了解Activity的生命周期對于開發高質量的Android應用至關重要。
Activity的生命周期由以下幾個回調方法組成:
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()
\-> onRestart() -> onStart() -> onResume()
開發者需要在不同的生命周期回調中執行相應的操作,以確保應用的穩定性和性能。例如:
創建一個新的Activity通常包括以下幾個步驟:
AppCompatActivity
或Activity
類。res/layout
目錄下創建XML布局文件。onCreate()
方法中使用setContentView()
方法綁定布局文件。AndroidManifest.xml
文件中聲明Activity。public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
<!-- res/layout/activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, World!" />
</LinearLayout>
<!-- AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<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/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
在AndroidManifest.xml
文件中,可以通過<activity>
標簽配置Activity的屬性。常用的配置項包括:
<activity
android:name=".MainActivity"
android:label="Main Activity"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode="standard"
android:screenOrientation="portrait">
</activity>
啟動一個Activity通常使用startActivity()
方法,并通過Intent
指定目標Activity。
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
關閉一個Activity可以使用finish()
方法。
finish();
有時需要從目標Activity返回結果給源Activity,這時可以使用startActivityForResult()
方法。
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
在目標Activity中,使用setResult()
方法返回結果。
Intent resultIntent = new Intent();
resultIntent.putExtra("result", "Hello from SecondActivity");
setResult(RESULT_OK, resultIntent);
finish();
在源Activity中,重寫onActivityResult()
方法處理返回結果。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String result = data.getStringExtra("result");
// 處理返回結果
}
}
Intent不僅可以用于啟動Activity,還可以用于在Activity之間傳遞數據??梢酝ㄟ^putExtra()
方法將數據放入Intent中,然后在目標Activity中通過getIntent()
方法獲取數據。
// 源Activity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
// 目標Activity
Intent intent = getIntent();
String value = intent.getStringExtra("key");
Bundle是一個鍵值對集合,可以用于在Activity之間傳遞復雜的數據結構。
// 源Activity
Bundle bundle = new Bundle();
bundle.putString("key", "value");
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);
// 目標Activity
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
String value = bundle.getString("key");
}
SharedPreferences是一種輕量級的存儲方式,可以用于在Activity之間共享簡單的數據。
// 源Activity
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("key", "value");
editor.apply();
// 目標Activity
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
String value = sharedPreferences.getString("key", "default_value");
Activity的啟動模式決定了Activity的實例如何被創建和管理。Android提供了四種啟動模式:
可以在AndroidManifest.xml
文件中通過android:launchMode
屬性配置Activity的啟動模式。
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
</activity>
Fragment是Android中的一種UI組件,可以嵌入到Activity中。Fragment有自己的生命周期,可以與Activity進行交互。
Fragment的生命周期與Activity的生命周期類似,但也有自己的特點。Fragment的生命周期包括以下幾個回調方法:
onCreate()
方法執行完畢后調用。創建一個Fragment通常包括以下幾個步驟:
Fragment
類。res/layout
目錄下創建XML布局文件。onCreateView()
方法中使用inflater.inflate()
方法綁定布局文件。FragmentManager
和FragmentTransaction
將Fragment添加到Activity中。public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_my, container, false);
}
}
<!-- res/layout/fragment_my.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, Fragment!" />
</LinearLayout>
// 在Activity中使用Fragment
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container, new MyFragment());
fragmentTransaction.commit();
Fragment與Activity之間可以通過接口進行通信。通常的做法是在Fragment中定義一個接口,并在Activity中實現該接口。
public class MyFragment extends Fragment {
private OnFragmentInteractionListener mListener;
public interface OnFragmentInteractionListener {
void onFragmentInteraction(String data);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
private void sendDataToActivity(String data) {
if (mListener != null) {
mListener.onFragmentInteraction(data);
}
}
}
public class MainActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {
@Override
public void onFragmentInteraction(String data) {
// 處理Fragment傳遞的數據
}
}
Activity之間的跳轉可以通過動畫效果增強用戶體驗。Android提供了多種方式來實現Activity的動畫效果。
Android系統提供了一些默認的Activity切換動畫,可以通過overridePendingTransition()
方法應用這些動畫。
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
可以通過在res/anim
目錄下創建XML文件來定義自定義動畫。
<!-- res/anim/slide_in_right.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="300" />
</set>
<!-- res/anim/slide_out_left.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="300" />
</set>
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
Android 5.0(API 21)引入了Transition API,可以用于實現更復雜的Activity切換動畫。
// 在源Activity中
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, view, "transition_name");
startActivity(intent, options.toBundle());
// 在目標Activity中
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Slide(Gravity.RIGHT));
getWindow().setExitTransition(new Slide(Gravity.LEFT));
Android系統提供了權限管理機制,確保應用在訪問敏感資源時得到用戶的授權。
在Android 6.0(API 23)及以上版本中,應用需要在運行時請求權限。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
}
在Activity中重寫onRequestPermissionsResult()
方法處理權限請求結果。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 權限已授予
} else {
// 權限被拒絕
}
}
}
在開發過程中,可能會遇到各種異常情況,如空指針異常、網絡異常等。合理的異常處理可以提高應用的穩定性和用戶體驗。
try {
// 可能拋出異常的代碼
} catch (NullPointerException e) {
Log.e("MainActivity", "NullPointerException: " + e.getMessage());
Toast.makeText(this, "發生了一個錯誤,請稍后再試", Toast.LENGTH_SHORT).show();
} catch (IllegalStateException e) {
Log.e("MainActivity", "IllegalStateException: " + e.getMessage());
Toast.makeText(this, "應用狀態異常,請重啟應用", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Log.e("MainActivity", "Exception: " + e.getMessage());
Toast.makeText(this, "發生了一個未知錯誤", Toast.LENGTH_SHORT).show();
}
Activity的性能優化是提高應用響應
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。