深入分析 Android Activity (五)

打印 上一主题 下一主题

主题 520|帖子 520|积分 1560

深入分析 Android Activity (五)

1. Activity 的历程和线程模子

在 Android 中,Activity 默认在主线程(也称为 UI 线程)中运行。明白历程和线程模子对于开发相应灵敏且无壅闭的应用程序至关重要。
1.1 主线程与 UI 操作

所有 UI 操作必须在主线程中执行,以制止并发标题和 UI 不同等性。长时间的操作应在工作线程中完成,并利用主线程处理效果。
  1. // Performing a long-running operation on a background thread
  2. new Thread(new Runnable() {
  3.     @Override
  4.     public void run() {
  5.         // Long-running operation
  6.         final String result = performOperation();
  7.         
  8.         // Post result back to the main thread
  9.         runOnUiThread(new Runnable() {
  10.             @Override
  11.             public void run() {
  12.                 // Update UI with the result
  13.                 textView.setText(result);
  14.             }
  15.         });
  16.     }
  17. }).start();
复制代码
1.2 利用 AsyncTask

AsyncTask 是一种方便的方式,可以在后台线程中执行操作,并在主线程中处理效果。不过,由于其轻易导致内存泄漏和其他标题,如今更保举利用 ExecutorService 或 RxJava。
  1. private class MyAsyncTask extends AsyncTask<Void, Void, String> {
  2.     @Override
  3.     protected String doInBackground(Void... voids) {
  4.         return performOperation();
  5.     }
  6.     @Override
  7.     protected void onPostExecute(String result) {
  8.         textView.setText(result);
  9.     }
  10. }
  11. // Execute the AsyncTask
  12. new MyAsyncTask().execute();
复制代码
1.3 利用 Handler 和 Looper

Handler 和 Looper 提供了一种机动的方法来管理线程间通讯。
  1. // Creating a Handler on the main thread
  2. Handler handler = new Handler(Looper.getMainLooper());
  3. // Running code on the main thread
  4. handler.post(new Runnable() {
  5.     @Override
  6.     public void run() {
  7.         // Update UI
  8.         textView.setText("Updated from background thread");
  9.     }
  10. });
复制代码
2. Activity 的内存优化

内存管理是 Android 开发中的一个重要方面,特别是在设备资源有限的环境下。以下是一些常见的内存优化技巧。
2.1 制止内存泄漏

利用弱引用和上下文的短生命周期对象可以制止内存泄漏。制止在 Activity 和 Fragment 中直接引用长生命周期对象,如单例模式。
  1. // Use WeakReference to avoid memory leaks
  2. private static class MyHandler extends Handler {
  3.     private final WeakReference<MyActivity> mActivity;
  4.     MyHandler(MyActivity activity) {
  5.         mActivity = new WeakReference<>(activity);
  6.     }
  7.     @Override
  8.     public void handleMessage(Message msg) {
  9.         MyActivity activity = mActivity.get();
  10.         if (activity != null) {
  11.             // Handle message
  12.         }
  13.     }
  14. }
复制代码
2.2 利用内存分析工具

Android Studio 提供了内存分析工具,可以帮助检测和解决内存泄漏。
  1. // Use Android Profiler to detect memory leaks
复制代码
2.3 优化 Bitmap 利用

Bitmaps 是常见的内存消耗大户。利用适当的压缩和回收策略来优化 Bitmap 利用。
  1. // Decode bitmap with inSampleSize to reduce memory usage
  2. BitmapFactory.Options options = new BitmapFactory.Options();
  3. options.inSampleSize = 2;
  4. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options);
  5. // Recycle bitmap to free memory
  6. bitmap.recycle();
复制代码
3. Activity 的跨历程通讯(IPC)

在 Android 中,跨历程通讯通常利用 AIDL(Android Interface Definition Language)、Messenger 或 ContentProvider 来实现。
3.1 利用 AIDL

AIDL 提供了一种定义接口以便在不同历程之间通讯的方法。
  1. // IMyAidlInterface.aidl
  2. interface IMyAidlInterface {
  3.     void performAction();
  4. }
复制代码
实现 AIDL 接口:
  1. public class MyService extends Service {
  2.     private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {
  3.         @Override
  4.         public void performAction() {
  5.             // Perform action
  6.         }
  7.     };
  8.     @Override
  9.     public IBinder onBind(Intent intent) {
  10.         return mBinder;
  11.     }
  12. }
复制代码
在客户端绑定服务:
  1. private IMyAidlInterface mService;
  2. private ServiceConnection mConnection = new ServiceConnection() {
  3.     @Override
  4.     public void onServiceConnected(ComponentName className, IBinder service) {
  5.         mService = IMyAidlInterface.Stub.asInterface(service);
  6.     }
  7.     @Override
  8.     public void onServiceDisconnected(ComponentName className) {
  9.         mService = null;
  10.     }
  11. };
  12. // Bind to the service
  13. Intent intent = new Intent(this, MyService.class);
  14. bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
复制代码
4. 深入明白 Activity 的设置变革处理

设置变革(如屏幕旋转、语言更改等)会导致 Activity 被烧毁并重新创建。开发者可以通过重写 onConfigurationChanged 方法来处理特定设置变革,制止 Activity 重新创建。
4.1 在 Manifest 文件中声明设置变革

  1. <activity android:name=".MyActivity"
  2.     android:configChanges="orientation|screenSize|keyboardHidden">
  3. </activity>
复制代码
4.2 重写 onConfigurationChanged 方法

  1. @Override
  2. public void onConfigurationChanged(Configuration newConfig) {
  3.     super.onConfigurationChanged(newConfig);
  4.     // Handle configuration changes
  5.     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  6.         // Handle landscape orientation
  7.     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
  8.         // Handle portrait orientation
  9.     }
  10. }
复制代码
5. Activity 的调试和日志记录

5.1 利用 Logcat

Logcat 是 Android 提供的日志记录工具,开发者可以利用 Log 类来记录调试信息。
  1. // Log debug information
  2. Log.d("MyActivity", "Debug message");
  3. // Log error information
  4. Log.e("MyActivity", "Error message", throwable);
复制代码
5.2 利用调试工具

Android Studio 提供了强大的调试工具,包括断点调试、内存分析、性能分析等。
  1. // Use breakpoints to debug the application
复制代码
6. Activity 的单元测试和 UI 测试

测试是确保应用程序质量的关键环节,Android 提供了多种测试框架和工具来进行单元测试和 UI 测试。
6.1 利用 JUnit 进行单元测试

JUnit 是一个常用的 Java 单元测试框架,Android 提供了对 JUnit 的支持。
  1. // Example unit test
  2. public class MyActivityTest {
  3.     @Test
  4.     public void addition_isCorrect() {
  5.         assertEquals(4, 2 + 2);
  6.     }
  7. }
复制代码
6.2 利用 Espresso 进行 UI 测试

Espresso 是一个用于编写 UI 测试的框架。
  1. // Example UI test
  2. @RunWith(AndroidJUnit4.class)
  3. public class MyActivityTest {
  4.     @Rule
  5.     public ActivityTestRule<MyActivity> activityRule =
  6.             new ActivityTestRule<>(MyActivity.class);
  7.     @Test
  8.     public void ensureTextChangesWork() {
  9.         onView(withId(R.id.editText))
  10.                 .perform(typeText("Hello"), closeSoftKeyboard());
  11.         onView(withId(R.id.changeTextButton)).perform(click());
  12.         onView(withId(R.id.textView)).check(matches(withText("Hello")));
  13.     }
  14. }
复制代码
总结

深入明白和掌握 Activity 的各个方面,包括其生命周期、内存管理、历程和线程模子、设置变革处理、调试和测试,对于开发高效、稳固和用户友爱的 Android 应用程序至关重要。通过不断学习和实践,可以提升应用程序的性能和用户体验,满足不断变革的用户需求。
接待点赞|关注|收藏|评论,您的肯定是我创作的动力


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表