30/09/2018, 23:41

Android - Keep service alive after exit app

Cho mình hỏi:
Theo docs của android thì

A service is a component that runs in the background to perform long-running operations or to perform work for remote processes. A service does not provide a user interface. For example, a service might play music in the background while the user is in a different application, or it might fetch data over the network without blocking user interaction with an activity. Another component, such as an activity, can start the service and let it run or bind to it in order to interact with it. A service is implemented as a subclass of Service and you can learn more about it in the Services developer guide.

So, as long as you create a service, and the user exits your app it will still run. Just like the example above.

Theo nó nói thì service chạy độc lập với activity khi tắt app nó vẫn chạy, nhưng sao mình thử cho phát nhạc bằng MediaPlayer trong Service thì tắt app nó tắt nhạc theo luôn.

Đã thử dùng startForeGround() với Notification, nhưng mới dùng lần đầu nên nó ko work.
Đây là hàm onStartCommand() trong MyService.java của mình

https://scontent-sin6-1.xx.fbcdn.net/v/t1.0-9/14291855_1030871367031068_3299865655875730517_n.jpg?oh=11f2ea207e7a7d2b93351cf0657a4035&oe=584A8018

Giờ làm sao để nó hoạt động nhỉ? Cảm ơn mọi người!

Tâm Ninja viết 01:47 ngày 01/10/2018

Đó là do service của bạn đang chạy cùng một process với mainUIThread. Như ta đã biết là activity là class chiếm toàn quyền chỉ huy của ứng dụng. Khi bạn tắt activity cuối cùng đi thì process đang chứa nó cũng sẽ được giải phóng nên nó giải phóng luôn cái service của bạn.

Cách khắc phục: Thêm đoạn khai báo sau vào service của bạn.

    android:process=":your_process_name"

Có một số lưu ý như sau:

  • Khác process đồng nghĩa với khác sandbox nên sẽ không thể dùng LocalBroadcastManager, không bind lên view của nhau được.
  • Việc chủ động tắt service cũng lằng nhằng hơn một tí bạn tự tìm hiểu nhé.
  • Còn vài cái nữa mà lâu không làm mình quên mất rồi.
Đoàn Hiếu Tâm viết 01:43 ngày 01/10/2018

Mình thử thêm rồi, thậm chỉ đã định rõ lại tên process của application cho khác với service luôn vẫn không được bạn ơi.

Tâm Ninja viết 01:58 ngày 01/10/2018

Cho mình xem khai báo Androidmanifest của bạn với.

Đoàn Hiếu Tâm viết 01:50 ngày 01/10/2018
 <application
        android:process=":myApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <service android:name=".MyService"
            android:process=":myService"
            android:enabled="true"
            android:exported="true"/>
</application>
Tâm Ninja viết 01:51 ngày 01/10/2018

Cái này lạ nhỉ. Chỉ có thể là service của bạn dùng quá nhiều tài nguyên nên mới bị kill đi thôi. Chứ không thì mình cũng không có nghĩ ra nữa.

Đoàn Hiếu Tâm viết 01:55 ngày 01/10/2018

Mình dùng có 1 cái MediaPlayer thôi. Test trên điện thoại Xiaomi Redmi 3 Pro, Ram 3GB nên chắc cũng khộng thiếu Ram tới mức kill cái service đâu.
Mà mình làm đúng không nhỉ? Mình tắt app bằng cách giữ nút home rồi trượt ứng dụng ra khỏi stack

Quân viết 01:58 ngày 01/10/2018

Mình tắt app bằng cách giữ nút home rồi trượt ứng dụng ra khỏi stack

đây đâu gọi là tắt app mà là giết app, android sẽ hiểu là bạn muốn tắt hoàn toàn app này nên giết tất không chừa 1 mống

Bài liên quan
0