Khởi chạy ứng dụng Android mà không có Hoạt động chính và bắt đầu Dịch vụ khi khởi chạy ứng dụng


90

Tôi có tình huống sau trong ứng dụng của mình. Không có giao diện người dùng trong ứng dụng của tôi; thay vào đó là một Dịch vụ bắt đầu khởi động và sẽ liên tục chạy.

Làm cách nào để định cấu hình tệp kê khai của tôi mà không có Hoạt động chính? Tôi có thể khởi chạy ứng dụng của mình mà không có bất kỳ Hoạt động nào không? Và khi khởi chạy ứng dụng của tôi, Dịch vụ của tôi sẽ bắt đầu. Điều này có khả thi không?

Tôi không muốn thực hiện Hoạt động mờ để bắt đầu Dịch vụ.


có một cái nhìn vào [câu hỏi] này [1] [1]: stackoverflow.com/questions/4468006/...
Munish Kapoor

Câu trả lời:


125

Bạn nói rằng bạn không muốn sử dụng Hoạt động mờ, nhưng đó có vẻ là cách tốt nhất để làm điều này:

  1. Trong Tệp kê khai của bạn, hãy đặt chủ đề Hoạt động thành Theme.Translucent.NoTitleBar.
  2. Đừng bận tâm đến bố cục cho Hoạt động của bạn và đừng gọi setContentView().
  3. Trong Hoạt động của bạn onCreate(), hãy bắt đầu Dịch vụ của bạn với startService().
  4. Thoát khỏi Hoạt động finish()khi bạn đã bắt đầu Dịch vụ.

Nói cách khác, Hoạt động của bạn không cần phải hiển thị; nó chỉ có thể đảm bảo rằng Dịch vụ của bạn đang chạy và sau đó thoát ra, điều này có vẻ giống như những gì bạn muốn.

Tôi thực sự khuyên bạn nên hiển thị ít nhất một thông báo Toast cho người dùng biết rằng bạn đang khởi chạy Dịch vụ hoặc rằng nó đã đang chạy. Trải nghiệm người dùng rất tệ khi có biểu tượng trình khởi chạy xuất hiện không làm được gì khi bạn nhấn vào nó.


2
nó cho tôi màn hình trống sau khi khởi chạy ứng dụng của tôi. nhưng không phải vậy ...
Meher

1
@meher Tôi vừa thử nghiệm nó và nó hoạt động hoàn hảo đối với tôi - Dịch vụ của tôi đã bắt đầu và tôi không thấy bất kỳ Hoạt động nào, dù chỉ trong giây lát. Vui lòng đăng nội dung của Activity trên onCreate () của bạn và chúng tôi sẽ có thể tìm ra điều gì sai.
Darshan Rivka Whittle

khi tôi cài đặt ứng dụng của mình lần đầu tiên, tôi có thể thấy hoạt động được khởi chạy và biến mất sau một giây.
Meher

lớp công khai TestActivity mở rộng Hoạt động {/ ** Được gọi khi hoạt động được tạo lần đầu tiên. * / @Override public void onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); Log.i ("hoạt động", "bắt đầu dịch vụ"); startService (Intent mới (TestActivity.this, MyService.class)); hoàn thành(); }}
Meher

1
Tôi nhận ra đây là một câu hỏi cũ, nhưng nó dường như không còn hoạt động nữa. Thay đổi chủ đề hoạt động chính thành Theme.Translucent.NoTitleBar hoặc Theme.Translucent.NoTitleBar.FullScreen khiến một ứng dụng đang hoạt động khác hiển thị nhanh màn hình hoạt động thành một màn hình luôn gây ra thông báo "ứng dụng đã ngừng phản hồi".
alzee

32

Có, bạn có thể làm điều đó bằng cách tạo một BroadcastReceiverlệnh gọi của bạn Servicekhi Ứng dụng của bạn khởi động. Đây là một câu trả lời đầy đủ do tôi đưa ra.
Android - Bắt đầu dịch vụ khi khởi động

Nếu bạn không muốn bất kỳ biểu tượng / trình khởi chạy nào cho mình Ứng dụng bạn cũng có thể làm điều đó, chỉ cần không tạo bất kỳ Hoạt động nào với

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Chỉ cần khai báo của bạn Servicenhư đã khai báo bình thường.


2
Có vẻ như người hỏi vẫn ổn khi khởi động Servicekhi khởi động, nhưng muốn biết cách không có main Activity, nhưng chỉ cần đảm bảo rằng main Serviceđang chạy khi nhấn biểu tượng launcher.
Darshan Rivka Whittle

2
Nhưng có vẻ như họ muốn một biểu tượng trình khởi chạy, khi được nhấn, đảm bảo rằng Dịch vụ đang chạy. Đề xuất của bạn chỉ đơn giản là loại bỏ biểu tượng trình khởi chạy.
Darshan Rivka Whittle

@LalitPoptani giải pháp tốt. Nhưng dịch vụ của tôi sẽ không bắt đầu cho đến khi tôi khởi động điện thoại.
Meher

4
Tôi không thể khởi động ứng dụng của mình mà không có MAIN, LAUNCHER trong AndroidMenifest.xml ngoại trừ SyncAdapter. Câu trả lời của bạn có thực sự đúng?
sunghun

1
Tôi đã xóa bộ lọc ý định với thẻ hành động và danh mục. Hiện tại, ứng dụng không còn chạy trong studio android
Nauman Ash

11

Lý do để tạo một Ứng dụng không có hoạt động hoặc dịch vụ có thể là tạo một ứng dụng Tiện ích màn hình chính không cần khởi động.
Khi bạn bắt đầu một dự án, đừng tạo bất kỳ hoạt động nào. Sau khi bạn tạo dự án, chỉ cần nhấn chạy. Studio Android sẽ nói No default activity found.

Nhấp vào Chỉnh sửa cấu hình (Từ menu Chạy ) và trong phần tùy chọn Khởi chạy, đặt giá trị Khởi chạy thành Không có gì . Sau đó nhấp vào ok và chạy Ứng dụng.

( Vì không có hoạt động của trình khởi chạy, sẽ không có ứng dụng nào được hiển thị trong menu Ứng dụng. ).


Cảm ơn, đó chính xác là trường hợp của tôi. Trong trường hợp bạn không thấy Chỉnh sửa cấu hình như tôi đã, chọn Run> Run ... từ menu chính và sau đó chọn Sửa Configurations ... .
chiều_

6

Phiên bản Android Studio 2.3

Bạn có thể tạo một Dịch vụ mà không có Hoạt động chính bằng cách làm theo một vài bước đơn giản. Bạn sẽ có thể cài đặt ứng dụng này thông qua Android Studio và gỡ lỗi nó như một ứng dụng bình thường.

Đầu tiên, tạo một dự án trong Android Studio mà không có hoạt động. Sau đó, tạo lớp Dịch vụ của bạn và thêm dịch vụ vào AndroidManifest.xml của bạn

<application android:allowBackup="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service android:name="com.whatever.myservice.MyService">
        <intent-filter>
            <action android:name="com.whatever.myservice.MyService" />
        </intent-filter>
    </service>
</application>

Bây giờ, trong menu thả xuống bên cạnh nút "Chạy" (mũi tên màu xanh lá cây), chuyển đến "chỉnh sửa cấu hình" và trong "Tùy chọn khởi chạy", chọn "Không có gì". Điều này sẽ cho phép bạn cài đặt Dịch vụ của mình mà không cần Android Studio phàn nàn về việc không có Hoạt động chính.

Sau khi được cài đặt, dịch vụ sẽ KHÔNG chạy nhưng bạn sẽ có thể khởi động nó bằng lệnh adb shell này ...

am startservice -n com.whatever.myservice/.MyService

Có thể kiểm tra xem nó đang chạy bằng ...

ps | grep whatever

Tôi chưa thử nhưng bạn cũng có thể để Android Studio tự động khởi động dịch vụ. Điều này sẽ được thực hiện trong menu "Chỉnh sửa cấu hình".


Tôi gặp lỗi sau từ adb shell: Đang khởi động dịch vụ: Intent {cmp = com.example.wolk.myapp / .MyIntentService} Lỗi: Không tìm thấy; không có dịch vụ nào bắt đầu. Logcat show: ActivityManager: không cho phép để bắt đầu ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.