Flag_activity_clear_task flag_activity_clear_top năm 2024

前面介绍了通过launchMode设置Activity的启动模式。本章接着介绍Activity的启动模式相关内容,讲解的内容是Intent与启动模式相关的Flag,以及android:taskAffinity的属性。

目录 1. 2. 3. 4. 5.

Intent与启动模式相关的Flag简介

这里仅仅对几个常用的与启动模式相关的Flag进行介绍。

  1. FLAG_ACTIVITY_NEW_TASK 在google的官方文档中介绍,它与launchMode="singleTask"具有相同的行为。实际上,并不是完全相同! 很少单独使用FLAG_ACTIVITY_NEW_TASK,通常与FLAG_ACTIVITY_CLEAR_TASK或FLAG_ACTIVITY_CLEAR_TOP联合使用。因为单独使用该属性会导致奇怪的现象,通常达不到我们想要的效果!尽管如何,后面还是会通过"FLAG_ACTIVITY_NEW_TASK示例一"和"FLAG_ACTIVITY_NEW_TASK示例二"会向你展示单独使用它的效果。
  2. FLAG_ACTIVITY_SINGLE_TOP 在google的官方文档中介绍,它与launchMode="singleTop"具有相同的行为。实际上,的确如此!单独的使用FLAG_ACTIVITY_SINGLE_TOP,就能达到和launchMode="singleTop"一样的效果。
  3. FLAG_ACTIVITY_CLEAR_TOP 顾名思义,FLAG_ACTIVITY_CLEAR_TOP的作用清除"包含Activity的task"中位于该Activity实例之上的其他Activity实例。FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK两者同时使用,就能达到和launchMode="singleTask"一样的效果!
  4. FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_CLEAR_TASK的作用包含Activity的task。使用FLAG_ACTIVITY_CLEAR_TASK时,通常会包含FLAG_ACTIVITY_NEW_TASK。这样做的目的是启动Activity时,清除之前已经存在的Activity实例所在的task;这自然也就清除了之前存在的Activity实例!

注意:当同时使用launchMode和上面的FLAG_ACTIVITY_NEW_TASK等标签时,以FLAG_ACTIVITY_NEW_TASK为标准。也就是说,代码的优先级比manifest中配置文件的优先级更高!

下面,通过几个实例加深对这几个标记的理解。

1. FLAG_ACTIVITY_NEW_TASK标签测试

1.1 FLAG_ACTIVITY_NEW_TASK示例一

点击查看:FLAG_ACTIVITY_NEW_TASK示例一的源码

在该实例中,有两个Activity:ActivityTest和SecondActivity。manifest定义如下:


    
        
            
            
        
    
    

说明:通过manifest可以看出,ActivityTest和SecondActivity在同一个APK中。这也就意味着它们的android:taskAffinity是一样的!

ActivityTest的源码

public class ActivityTest extends Activity {
    private static final String TAG="
## ActivityTest##";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAG, "onCreate: "+this.toString()+", taskId="+this.getTaskId());
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(this.toString()+", taskId="+this.getTaskId());
    }   
    public void onJump(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }   
    @Override
    protected void onNewIntent(Intent intent) {
        Log.d(TAG, "onNewIntent: intent="+intent+", activity="+this+", taskId="+this.getTaskId());
    }   
}

说明:onJump()是ActivityTest中一个按钮的回调函数,点击该按钮会跳转到SecondActivity。注意,跳转的Intent添加了FLAG_ACTIVITY_NEW_TASK标志。

SecondActivity的源码

public class SecondActivity extends Activity {
    private static final String TAG="
## SecondActivity##";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        Log.d(TAG, "onCreate: "+this.toString()+", taskId="+this.getTaskId());
        TextView tv = (TextView) findViewById(R.id.tv2);
        tv.setText(this.toString()+", taskId="+this.getTaskId());
    }   
    public void onBack(View view) {
        Intent intent = new Intent(this, ActivityTest.class);
        startActivity(intent);
    }   
    @Override
    protected void onNewIntent(Intent intent) {
        Log.d(TAG, "onNewIntent: intent="+intent+", activity="+this+", taskId="+this.getTaskId());
    }   
}

说明:onBack()是SecondActivity中一个按钮的回调函数,点击该按钮会跳转回ActivityTest。

测试内容:ActivityTest > SecondActivity > ActivityTest --> SecondActivity 测试结果:(01) ActivityTest和SecondActivity在同一个task中。 (02) 两个SecondActivity不同的实例! 结果分析:如果说FLAG_ACTIVITY_NEW_TASK的作用和singleTask具有相同的效果。那么这个示例很明显的否则了这个结论!事实上,在相互跳转的两个Activity的android:taskAffinity相同的情况下,单独使用FLAG_ACTIVITY_NEW_TASK不会产生任何效果!

那如果两个Activity的android:taskAffinity不相同呢?此时会导致什么效果呢?下面,我们通过示例来看看效果。

1.2 FLAG_ACTIVITY_NEW_TASK示例二

点击查看:FLAG_ACTIVITY_NEW_TASK示例二的源码

我们修改"FLAG_ACTIVITY_NEW_TASK示例一"中manifest,将ActivityTest和SecondActivity的android:taskAffinity改为不同;其余的保持不变!修改后的manifest如下:

18. Trình bày hai cách xoá toàn bộ backstack các Activities khi khởi động một Activity mới bằng Intent

  • Cách 1. Sử dụng cờ FLAG_ACTIVITY_CLEAR_TOP.
  • Cách 2. Sử dụng FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK kết hợp với nhau.

19. Khác biệt giữa FLAG_ACTIVITY_CLEAR_TASK và FLAG_ACTIVITY_CLEAR_TOP là gì?

FLAG_ACTIVITY_CLEAR_TASK được sử dụng để xóa tất cả các hoạt động khỏi tác vụ bao gồm mọi phiên bản hiện có của lớp được gọi. Activity được khởi chạy theo ý định trở thành gốc mới của danh sách nhiệm vụ trống. Cờ này phải được sử dụng cùng với FLAG_ ACTIVITY_NEW_TASK

Mặt khác, FLAG_ACTIVITY_CLEAR_TOP, nếu được đặt và nếu một phiên bản cũ của Acvitity này tồn tại trong danh sách nhiệm vụ thì tất cả các activities khác bị xóa và FLAG_ACTIVITY_CLEAR_TASK`0 cũ đó trở thành gốc của danh sách nhiệm vụ. Nếu không có phiên bản nào của activity đó thì một phiên bản mới của nó sẽ được đặt làm gốc của danh sách tác vụ. Sử dụng `FLAG_ACTIVITY_NEW_TASK kết hợp là một phương pháp hay, mặc dù không cần thiết.

20. Mô tả về ContentProvider

`FLAG_ACTIVITY_CLEAR_TASK`2 quản lý quyền truy cập vào kho dữ liệu trung tâm. Nó là một phần của ứng dụng Android, thường cung cấp giao diện người dùng riêng để làm việc với dữ liệu. Tuy nhiên, các `FLAG_ACTIVITY_CLEAR_TASK`3chủ yếu nhằm mục đích được sử dụng bởi các ứng dụng khác, các ứng dụng này truy cập vào content provider bằng cách sử dụng một đối tượng client cung cấp. Cùng với nhau, nhà cung cấp và khách hàng của nhà cung cấp cung cấp một giao diện tiêu chuẩn, nhất quán cho dữ liệu cũng xử lý giao tiếp giữa các quá trình và truy cập dữ liệu an toàn.

Thông thường, bạn làm việc với các nhà cung cấp nội dung theo một trong hai tình huống; bạn có thể muốn triển khai mã để truy cập một `FLAG_ACTIVITY_CLEAR_TASK`3 hiện có trong một ứng dụng khác hoặc bạn có thể muốn tạo một `FLAG_ACTIVITY_CLEAR_TASK`3 mới trong ứng dụng của mình để chia sẻ dữ liệu với các ứng dụng khác.

21. Truy cập dữ liệu bằng Content Provider

Khi bạn muốn truy cập dữ liệu trong `FLAG_ACTIVITY_CLEAR_TASK`3, bạn sử dụng đối tượng `FLAG_ACTIVITY_CLEAR_TASK`7 trong Ngữ cảnh của ứng dụng để giao tiếp với nhà cung cấp với tư cách là khách hàng. Đối tượng ContentResolver giao tiếp với đối tượng nhà cung cấp, một thể hiện của lớp triển khai ContentProvider. Đối tượng nhà cung cấp nhận yêu cầu dữ liệu từ máy khách, thực hiện hành động được yêu cầu và trả về kết quả. Đối tượng này có các phương thức gọi các phương thức có tên giống hệt nhau trong đối tượng nhà cung cấp, một phiên bản của một trong các lớp con cụ thể của ContentProvider. Các phương thức ContentResolver cung cấp các chức năng "CRUD" (tạo, truy xuất, cập nhật và xóa) cơ bản của `FLAG_ACTIVITY_CLEAR_TASK`8

22. Trình bày về Service

`FLAG_ACTIVITY_CLEAR_TASK`9 là một thành phần ứng dụng đại diện cho mong muốn của ứng dụng để thực hiện một hoạt động chạy lâu hơn trong khi không tương tác với người dùng hoặc cung cấp chức năng cho các ứng dụng khác sử dụng. Mỗi lớp Service phải có một khai báo `FLAG_ACTIVITY_NEW_TASK`0 tương ứng trong `FLAG_ACTIVITY_NEW_TASK`1 của gói. Service có thể được khởi động bằng `FLAG_ACTIVITY_NEW_TASK`2 và `FLAG_ACTIVITY_NEW_TASK`3. Có ba loại service

  • Foreground Service : Thực hiện một số hoạt động mà người dùng dễ nhận thấy. Ví dụ: chúng ta có thể sử dụng để phát một bản âm thanh. Một Thông báo phải được hiển thị cho người dùng.
  • Background Serivce : Thực hiện một hoạt động mà người dùng không trực tiếp nhận thấy. Trong Android API cấp 26 trở lên, có những hạn chế đối với việc sử dụng các background service và bạn nên sử dụng WorkManager trong những trường hợp này.
  • Bound Service: Một service bị ràng buộc khi một thành phần ứng dụng liên kết với nó bằng cách gọi `FLAG_ACTIVITY_NEW_TASK`4. Dịch vụ liên kết cung cấp giao diện máy khách-máy chủ cho phép các thành phần tương tác với dịch vụ, gửi yêu cầu, nhận kết quả. Một dịch vụ liên kết chỉ chạy miễn là một thành phần ứng dụng khác được liên kết với nó.

23. Khác nhau giữa Service và IntentService

`FLAG_ACTIVITY_CLEAR_TASK`9 là lớp cơ sở cho các dịch vụ Android có thể được mở rộng để tạo bất kỳ dịch vụ nào. Một lớp trực tiếp mở rộng từ `FLAG_ACTIVITY_CLEAR_TASK`9 chạy trên luồng chính vì vậy nó sẽ chặn giao diện người dùng (nếu có) và do đó chỉ nên được sử dụng cho các tác vụ ngắn hoặc nên sử dụng các `FLAG_ACTIVITY_NEW_TASK`7 khác cho các tác vụ dài hơn.

IntentService là một lớp con của Dịch vụ xử lý các yêu cầu không đồng bộ (được biểu thị dưới dạng "Intent") theo yêu cầu. Khách hàng gửi yêu cầu thông qua các cuộc gọi `FLAG_ACTIVITY_NEW_TASK`8. Dịch vụ được khởi động khi cần thiết, xử lý lần lượt từng `FLAG_ACTIVITY_NEW_TASK`9 bằng `FLAG_ACTIVITY_CLEAR_TASK`0và tự dừng khi hết công việc.

24. Khác nhau giữa Async Tasks và Thread

`FLAG_ACTIVITY_CLEAR_TASK`1 được sử dụng để tách các hoạt động đang chạy dài ra khỏi luồng chính để hiệu suất được cải thiện. Nhưng nó không thể bị hủy một cách đơn giản và nó không thể xử lý các thay đổi cấu hình của Android. Bạn không thể cập nhật giao diện người dùng từ Thread.

`FLAG_ACTIVITY_CLEAR_TASK`2 thì giống như một phương tiện giao tiếp giữa thread và UI thread.Nó cho phép bạn thực hiện việc khác ở background thread như gọi một API và cập nhật lại kết quả lên UI thread.

25. Khác nhau giữa Service, IntentService, Thread và Async task

Android Service là một thành phần được sử dụng để thực hiện các hoạt động trên nền như phát nhạc. Nó không có bất kỳ giao diện người dùng nào (giao diện người dùng). Dịch vụ có thể chạy ẩn vô thời hạn ngay cả khi ứng dụng bị hủy.

AsyncTask cho phép bạn thực hiện công việc không đồng bộ trên giao diện người dùng của mình. Nó thực hiện các hoạt động chặn trong một thread khác và sau đó xuất bản kết quả trên UI thread, mà không yêu cầu bạn tự xử lý các luồng và / hoặc trình xử lý.

IntentService là một lớp cơ sở cho các Dịch vụ xử lý các yêu cầu không đồng bộ (được biểu thị dưới dạng Intent) theo yêu cầu. Khách hàng gửi yêu cầu thông qua các cuộc gọi `FLAG_ACTIVITY_NEW_TASK`8; dịch vụ được khởi động khi cần thiết, xử lý lần lượt từng intent bằng `FLAG_ACTIVITY_CLEAR_TASK`0 và tự dừng khi hết công việc.

Thread là một luồng điều khiển tuần tự duy nhất trong một chương trình. Các luồng có thể được coi là các quy trình nhỏ chạy trong một quy trình chính.

26. Handler là gì?

Một Handler cho phép bạn gửi và xử lý các đối tượng Message và Runnable được liên kết với MessageQueue của một luồng. Mỗi cá thể của Handler được liên kết với một luồng duy nhất và hàng đợi thông báo của luồng đó. Khi bạn tạo một Handler mới, nó được liên kết với một Looper. Nó sẽ gửi thông điệp và quyền chạy đến hàng đợi tin nhắn của Looper đó và thực thi chúng trên chuỗi của Looper đó.

Có hai cách sử dụng chính cho Handler: (1) để lên lịch cho các thông báo và các quyền chạy sẽ được thực thi vào một thời điểm nào đó trong tương lai; và (2) để xếp hàng một hành động sẽ được thực hiện trên một luồng khác với luồng của bạn.

Handler được thực hiện ngoài vòng đời của Activity, vì vậy ta cần thực hiện dọn dẹp một cách cẩn thận, nếu ko sẽ gây ra rò rỉ bộ nhớ(memory leaks).

27. Job Scheduler là gì?

Đúng như tên gọi, JobSchedulerr API cho phép lập lịch công việc đồng thời cho phép hệ thống tối ưu hóa dựa trên điều kiện bộ nhớ, nguồn và kết nối. JobScheduler hỗ trợ lập lịch hàng loạt công việc. Hệ thống Android có thể kết hợp các công việc để giảm mức tiêu thụ pin. JobManager giúp việc xử lý tải lên dễ dàng hơn vì nó tự động xử lý tình trạng không đáng tin cậy của mạng. Nó cũng sống sót khi khởi động lại ứng dụng. Một số tình huống:

  • Các công việc cần thực hiện sau khi thiết bị được kết nối với nguồn điện
  • Các công việc yêu cầu quyền truy cập mạng hoặc kết nối Wi-Fi.
  • Công việc không quan trọng hoặc người dùng phải không chú ý.
  • Các công việc cần được chạy thường xuyên hàng loạt trong đó thời gian không quan trọng.

28. Mỗi quan hệ giữa vòng đời của Async Task và Activity? Những vấn đề khi sử dụng và cách giải quyết?

`FLAG_ACTIVITY_CLEAR_TASK`2 không được gắn với vòng đời của Activity chứa nó. Ví dụ, nếu bạn khởi động AsyncTask bên trong một Activity và khi người dùng quay thiết bị, Activity sẽ bị hủy (và một instance mới của Activity sẽ được tạo) nhưng AsyncTask sẽ không bị hủy mà thay vào đó sẽ tiếp tục chạy cho đến khi nó hoàn thành.

Sau đó, khi AsyncTask hoàn thành, thay vì cập nhật giao diện người dùng của Activity mới, nó sẽ cập nhật phiên bản Activity trước đó (Activity đã bị hủy). Điều này có thể dẫn đến một Exception:`FLAG_ACTIVITY_CLEAR_TASK`6

Ngoài ra còn có khả năng dẫn đến rò rỉ bộ nhớ (memory leak) vì AsyncTask duy trì một tham chiếu đến Activity cũ, ngăn cản Activity này bị thu gom rác của Java thu thập khi vẫn còn hoạt động.

Vì những lý do này, việc sử dụng AsyncTask cho các tác vụ nền chạy dài thường là một ý tưởng tồi. Thay vào đó đối với các tác vụ nền chạy dài, bạn nên sử dụng một cơ chế khác (chẳng hạn như `FLAG_ACTIVITY_CLEAR_TASK`7).

29. Phương thức onTrimMemory() là gì?

`FLAG_ACTIVITY_CLEAR_TASK`8: Được gọi khi hệ điều hành xác định rằng đây là thời điểm thích hợp để một tiến trình cắt bớt bộ nhớ không cần thiết khỏi tiến trình của nó. Điều này sẽ xảy ra chẳng hạn khi nó chạy ở chế độ nền và không có đủ bộ nhớ để giữ cho nhiều tiến trình nền chạy như mong muốn.

Android có thể lấy lại bộ nhớ từ ứng dụng của bạn theo một số cách hoặc hủy hoàn toàn ứng dụng của bạn nếu cần để giải phóng bộ nhớ cho các tác vụ quan trọng. Để giúp cân bằng bộ nhớ hệ thống và tránh việc hệ thống phải hủy quy trình ứng dụng của bạn, bạn có thể triển khai giao diện `FLAG_ACTIVITY_CLEAR_TASK`9 trong các lớp Hoạt động của mình. Phương thức gọi lại onTrimMemory () được cung cấp cho phép ứng dụng của bạn lắng nghe các sự kiện liên quan đến bộ nhớ khi ứng dụng của bạn ở nền trước hoặc nền sau đó giải phóng các đối tượng theo vòng đời ứng dụng hoặc các sự kiện hệ thống cho biết hệ thống cần lấy lại bộ nhớ.

30. Android Bound Service

A bound service là một dịch vụ cho phép các thành phần android khác (như hoạt động) liên kết với nó và gửi và nhận dữ liệu. A bound service là một dịch vụ có thể được sử dụng không chỉ bởi các thành phần chạy trong cùng một quy trình với dịch vụ cục bộ, mà các hoạt động và dịch vụ, chạy trong các quy trình khác nhau, có thể liên kết với nó và gửi và nhận dữ liệu.

Khi triển khai một dịch vụ ràng buộc, chúng ta phải mở rộng lớp Service nhưng chúng ta cũng phải ghi đè phương thức `FLAG_ACTIVITY_CLEAR_TOP`0. Phương thức này trả về một đối tượng triển khai `FLAG_ACTIVITY_CLEAR_TOP`1, có thể được sử dụng để tương tác với `FLAG_ACTIVITY_CLEAR_TASK`7.

31. Android Interface Definition Language (AIDL) và Messenger Queue

  • Messenger Queue tạo cho ta một hàng đợi và các dữ liệu / thông điệp được truyền giữa 2 hoặc nhiều hơn các tiến trình một cách tuần tự. Trong trường hợp của AIDL thì các thông điệp được truyền đi một cách song song.
  • AIDL sử dụng dành cho mục đích khi bạn phải giao tiếp ở mức ứng dụng để chia sẻ và kiểm soát dữ liệu. Ví dụ: một ứng dụng yêu cầu danh sách tất cả các liên hệ từ ứng dụng Danh bạ và nó cũng muốn hiển thị thời lượng cuộc gọi và bạn có thể ngắt kết nối nó khỏi ứng dụng đó.
  • Đối với trương hợp của Messenger Queue, bạn sẽ chủ yếu làm việc trên nhiều thread và process để quản lý hàng đợi chứa các thông điệp để không xuất hiện sự can thiệp của các dịch vụ bên ngoài tại đây.

32. ThreadPool là gì? Có hiệu quả hơn nếu sử dụng nó thay vì sử dụng nhiều Thread riêng biệt.

Việc tạo và hủy các Thread có mức sử dụng CPU cao, vì vậy khi chúng ta cần thực hiện rất nhiều tác vụ đơn giản, nhỏ, chi phí để tạo các Thread riêng rẽ có thể chiếm một phần đáng kể chu kỳ CPU và ảnh hưởng nghiêm trọng đến thời gian đáp ứng cuối cùng. ThreadPool bao gồm một hàng đợi nhiệm vụ và một nhóm các worker thread, cho phép nó chạy nhiều instance một cách song song của một tác vụ.

33. Sự khác biệt giữa Serializable và Parcelable?

`FLAG_ACTIVITY_CLEAR_TOP`3 là quá trình chuyển đổi một đối tượng thành một luồng (stream) byte để lưu trữ một đối tượng vào bộ nhớ, để nó có thể được tái tạo sau này khi cần, trong khi vẫn giữ trạng thái và dữ liệu ban đầu của đối tượng. `FLAG_ACTIVITY_CLEAR_TOP`4 là một `FLAG_ACTIVITY_CLEAR_TOP`5. `FLAG_ACTIVITY_CLEAR_TOP`6 là một interface cụ thể của Android, bạn phải tự triển khai việc `FLAG_ACTIVITY_CLEAR_TOP`7. Tuy nhiên `FLAG_ACTIVITY_CLEAR_TOP`6 có hiệu quả hơn nhiều so với Serializable (vấn đề với cách tiếp cận sử dụng Serializable là nó sự dụng cơ chế reflection và đó là một quá trình tương đối chậm. Cơ chế này cũng có xu hướng tạo ra rất nhiều đối tượng tạm thời và gây tiêu tốn tài nguyên khi bộ Garbage collection phải thu thập tất cả chúng).

What's the difference between Flag_activity_clear_task and Flag_activity_clear_top?

What's the difference between FLAG_ACTIVITY_CLEAR_TASK and FLAG_ACTIVITY_CLEAR_TOP? FLAG_ACTIVITY_CLEAR_TASK is used to clear all the activities from the task including any existing instances of the class invoked. The Activity launched by intent becomes the new root of the otherwise empty task list.

What is the use of Flag_activity_clear_top in Android?

FLAG_ACTIVITY_CLEAR_TOP. If the activity already exists, all of the activities above it will be destroyed. For itself, will be destroyed and recreated. Combine it with other flags.

What is Flag_activity_new_task?

For this I consulted the Android docs for the FLAG_ACTIVITY_NEW_TASK flag- When using this flag, if a task is already running for the activity you are now starting, then a new activity will not be started; instead, the current task will simply be brought to the front of the screen with the state it was last in.

How do you clear all background activity on Android?

Close all apps: Swipe up from the bottom, hold, then let go. Swipe from left to right. On the left, tap Clear all. Close all apps on Android Go: Swipe up from the bottom, hold, and let go.