2010-04-24 37 views
51

Có cách nào để khởi động hoạt động từ chức năng chính mà không cần có giao diện người dùng không? tức là có cách tạo một loại "trình bao bọc" xung quanh một hoạt động khác, tức là bằng cách khởi chạy hoạt động chính, nó sẽ đưa bạn đến một hoạt động khác tự động.Cách khởi chạy Hoạt động không có giao diện người dùng?

Nếu điều đó là không thể, có cách nào để xóa hoạt động chính khỏi ngăn xếp sao cho việc nhấp vào nút quay lại không đưa bạn đến giao diện người dùng trống không? Dưới đây là một ví dụ về những gì tôi đang cố gắng để làm:

public class WrapperActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-1212")); 
     startActivity(intent); 
    } 
} 

Trả lời

22

Bạn cần phải thêm cờ Ý định,

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

Hoặc

gọi "finish();" sau khi bắn mục đích.

+5

Tôi không chắc chắn rằng 'FLAG_ACTIVITY_CLEAR_TOP' lừa sẽ làm việc ở đây, bởi vì' Activity' được bắt đầu sẽ là từ một ứng dụng khác. 'finish()' chắc chắn sẽ hoạt động. – CommonsWare

+0

kết thúc() sẽ hoạt động. – Rajnikant

+0

Đã thêm kết thúc(); và Translucent.NoTitleBar để hiển thị. Làm việc như một say mê. – fjmustak

50

Trong biểu hiện của bạn, khi bạn khai báo hoạt động, sử dụng theme "@android:style/Theme.Translucent.NoTitleBar"

Ex:

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
+3

Đây là câu trả lời đúng nếu bạn cũng cần ứng dụng xuất hiện trong ngăn kéo ứng dụng. –

+2

Thao tác này vẫn mở giao diện người dùng ẩn mà bạn phải nhấn lại trước khi tiếp tục sử dụng điện thoại –

7

Sử dụng

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar"> 

đề cập bởi Brian515 hoạt động tuyệt vời. Phương pháp này hữu ích cho việc tạo một điểm vào Hoạt động quyết định hoạt động nào để gọi, bắt đầu, dịch vụ, vv mà không cần phải hiển thị giao diện người dùng cho người dùng. Hãy nhớ sử dụng finish() sau khi bạn đã bắt đầu ý định của mình.

107

Android cũng cung cấp một chủ đề đặc biệt cho việc này:

android:theme="@android:style/Theme.NoDisplay" 
+5

Tính năng này hoạt động tốt nhưng cũng khiến biểu tượng biến mất khỏi ngăn ứng dụng. Để biểu tượng xuất hiện, bạn cần sử dụng câu trả lời của Brian515. –

+1

Tôi cũng thấy rằng nó hoạt động, nhưng nếu tôi hiển thị hộp thoại tiến trình thì nó mặc định là Holo.Dark không khớp với kiểu của phần còn lại của ứng dụng của tôi. –

+1

@LearnOpenGLES Tôi đang sử dụng chủ đề này và tôi vẫn nhận được biểu tượng trong ngăn kéo ứng dụng. Tôi cũng tìm thấy nó là một lựa chọn tốt hơn, vì nó thiết lập một loạt các giá trị cho NULL, khiến tôi nghĩ rằng nó hiệu quả hơn. https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/themes.xml/refs/heads/master/core/res/res/values/ themes.xml – givanse

2

Trông giống với câu hỏi hỏi ở đây: Removing an activity from the history stack

Nếu có, sau đó bạn có thể sử dụng:

FLAG_ACTIVITY_NO_HISTORY

Thao tác này sẽ hoạt động để xóa các hoạt động khỏi ngăn xếp.

Nếu bạn cần loại trừ từ các ứng dụng gần đây (bấm và giữ nhà), bạn có thể sử dụng lá cờ này:

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

+0

Điều này không có gì để xóa một hoạt động khỏi ngăn xếp lịch sử. – Justin

+0

@Justin Tôi khá chắc chắn rằng câu hỏi có phần này: "Nếu điều đó là không thể, có cách nào để loại bỏ hoạt động chính khỏi ngăn xếp để nhấp vào nút quay lại không đưa bạn đến giao diện người dùng trống không?" Mà tôi tin rằng, là khá chặt chẽ gắn liền với ngăn xếp lịch sử, nhưng tôi có thể bị nhầm lẫn. –

+0

Tôi xin lỗi ... Tôi không nhận thấy hai câu cuối cùng trong câu hỏi. Trong mọi trường hợp, tôi không nghĩ rằng điều này giải quyết được vấn đề. Tôi có thể nhầm lẫn nhưng tôi không nghĩ rằng một trong các cờ này sẽ xóa hoạt động khỏi ngăn xếp lại (ví dụ: nhấn nút quay lại sẽ đưa người dùng đến giao diện người dùng trống) – Justin

1

Nếu bạn không tương tác với giao diện người dùng, những gì bạn đang cố gắng để làm âm thanh giống như một dịch vụ Android.

+3

Trong một số trường hợp có .... nhưng không phải trong mọi trường hợp. Nó dường như là một cái gì đó mà đã xuất hiện thường xuyên, đủ để các kỹ sư khung Android tạo ra một chủ đề cụ thể cho các hoạt động không có giao diện người dùng. – Justin

+0

Nếu tôi sử dụng, ví dụ, một thư viện của bên thứ ba để chọn phông chữ hoặc màu sắc, nó thường được thiết kế để yêu cầu Hoạt động khởi chạy nó để triển khai một số giao diện gọi lại. Nhưng tôi có thể đang khởi chạy bộ chọn màu từ cửa sổ bật lên.Nếu tôi muốn đóng gói toàn bộ luồng trong mã cho cửa sổ bật lên, thay vì làm ô nhiễm giao diện hoạt động chính của tôi, thì tôi cần một hoạt động tạm thời (vô hình) hoạt động như người nghe cho trình chọn màu – user3562927

2

Tôi đã sử dụng moveTaskToBack(true) trong onResume() để đặt toàn bộ chồng hoạt động ở chế độ nền.

+1

Tôi phải sử dụng phương pháp này vì Tôi muốn các hoạt động để hiển thị một số lần nhưng không phải lần khác. – Randy

7

Tôi nghĩ rằng điều này sẽ giúp bạn rất nhiều:

<activity android:name = "MyActivity" 
      android:label = "@string/app_name" 
      android:theme = "@android:style/Theme.NoDisplay" > 
+0

Chào mừng bạn đến với Stack Overflow! Stack Overflow thường hoạt động bằng tiếng Anh; hãy đảm bảo rằng bài đăng của bạn hữu ích nhất có thể cho người khác bằng cách dịch nó. –

+0

Tôi xin lỗi, tôi được cảnh báo, vì vậy và nó sẽ không xảy ra cảm ơn .. –

+0

Khi sử dụng phương pháp này hãy chú ý đến nhận xét của arunwithasmile – marchinram

2

Trong biểu hiện của bạn thêm @android:style/Theme.Translucent.NoTitleBar" như đã đề cập trong một số các câu trả lời ở trên.

Đồng thời xóa dòng setContentView(R.layout.your_activity); khỏi tệp activity.java của bạn.

6

Chỉ trong trường hợp bạn đang sử dụng Android 6.0+ hoặc Target SDK là 23+, việc có chủ đề android:theme = "@android:style/Theme.NoDisplay" sẽ dẫn đến sự cố với lỗi did not call finish() prior to onResume() completing. Thực tế, đây là lỗi được các nhà phát triển của Google công nhận here.

Vì vậy, bạn nên sử dụng hoạt động có chủ đề sau đây để giải quyết sự cố.

android:theme = "@android:style/Theme.Translucent.NoTitleBar"

+0

Cảm ơn rất nhiều, điều này phù hợp với tôi. –

+0

bạn có thể bắt đầu một chuỗi hoặc runnable hoặc dịch vụ hoặc bất cứ điều gì và gọi kết thúc trong onCreate – SAIR

Các vấn đề liên quan