รายงานสถานะงาน

คู่มือนี้แสดงวิธีรายงานสถานะของคำของานที่ทำงานในบริการเบื้องหลัง ไปยังคอมโพเนนต์ที่ส่งคำขอ ซึ่งจะช่วยให้คุณรายงานสถานะคำขอใน UI ของออบเจ็กต์ Activity ได้ เป็นต้น วิธีที่แนะนำในการส่งและ สถานะการรับคือการใช้ LocalBroadcastManager ซึ่ง จำกัดการออกอากาศ Intent ออบเจ็กต์ไปยังคอมโพเนนต์ในแอปของคุณเอง

สถานะรายงานจาก JobIntentService

หากต้องการส่งสถานะคำขอทำงานใน JobIntentService เป็นเครดิตอื่นๆ ก่อนอื่นให้สร้าง Intent ที่มีสถานะ ข้อมูลแบบขยายได้ คุณอาจเพิ่มการดำเนินการและ URI ข้อมูลลงใน URL นี้ Intent

ถัดไป ให้ส่ง Intent โดยโทรไปที่ LocalBroadcastManager.sendBroadcast() การดำเนินการนี้จะส่ง Intent ไปยัง ในแอปพลิเคชันของคุณที่ได้ลงทะเบียนรับไว้ หากต้องการรับอินสแตนซ์ของ LocalBroadcastManager ให้โทร getInstance()

เช่น

Kotlin

...
// Defines a custom Intent action
const val BROADCAST_ACTION = "com.example.android.threadsample.BROADCAST"
...
// Defines the key for the status "extra" in an Intent
const val EXTENDED_DATA_STATUS = "com.example.android.threadsample.STATUS"
...
class RSSPullService : JobIntentService() {
    ...
    /*
     * Creates a new Intent containing a Uri object
     * BROADCAST_ACTION is a custom Intent action
     */
    val localIntent = Intent(BROADCAST_ACTION).apply {
        // Puts the status into the Intent
        putExtra(EXTENDED_DATA_STATUS, status)
    }
    // Broadcasts the Intent to receivers in this app.
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent)
    ...
}

Java

public final class Constants {
    ...
    // Defines a custom Intent action
    public static final String BROADCAST_ACTION =
        "com.example.android.threadsample.BROADCAST";
    ...
    // Defines the key for the status "extra" in an Intent
    public static final String EXTENDED_DATA_STATUS =
        "com.example.android.threadsample.STATUS";
    ...
}
public class RSSPullService extends JobIntentService {
...
    /*
     * Creates a new Intent containing a Uri object
     * BROADCAST_ACTION is a custom Intent action
     */
    Intent localIntent =
            new Intent(Constants.BROADCAST_ACTION)
            // Puts the status into the Intent
            .putExtra(Constants.EXTENDED_DATA_STATUS, status);
    // Broadcasts the Intent to receivers in this app.
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
...
}

ขั้นตอนถัดไปคือการจัดการออบเจ็กต์ Intent ที่เข้ามาใหม่ใน คอมโพเนนต์ที่ส่งคำของานต้นฉบับ

รับการประกาศสถานะจาก JobIntentService

หากต้องการรับออบเจ็กต์ Intent ที่ออกอากาศ ให้ใช้คลาสย่อยของ BroadcastReceiver ในคลาสย่อย ให้ใช้BroadcastReceiver.onReceive() callback เมธอด ซึ่ง LocalBroadcastManager จะเรียกใช้เมื่อได้รับ Intent LocalBroadcastManager ส่ง Intent ขาเข้าไปยัง BroadcastReceiver.onReceive()

เช่น

Kotlin

// Broadcast receiver for receiving status updates from the IntentService.
private class DownloadStateReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        ...
        /*
         * Handle Intents here.
         */
        ...
    }
}

Java

// Broadcast receiver for receiving status updates from the IntentService.
private class DownloadStateReceiver extends BroadcastReceiver
{
    // Called when the BroadcastReceiver gets an Intent it's registered to receive
    @Override
    public void onReceive(Context context, Intent intent) {
...
        /*
         * Handle Intents here.
         */
...
    }
}

เมื่อกำหนด BroadcastReceiver แล้ว คุณจะกำหนดตัวกรองได้ ซึ่งตรงกับการกระทำ หมวดหมู่ และข้อมูลที่เจาะจง ในการดำเนินการนี้ ให้สร้าง IntentFilter ตัวอย่างข้อมูลแรกนี้จะแสดงวิธีกำหนดตัวกรอง ดังนี้

Kotlin

// Class that displays photos
class DisplayActivity : FragmentActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        super.onCreate(savedInstanceState)
        ...
        // The filter's action is BROADCAST_ACTION
        var statusIntentFilter = IntentFilter(BROADCAST_ACTION).apply {
            // Adds a data filter for the HTTP scheme
            addDataScheme("http")
        }
        ...

Java

// Class that displays photos
public class DisplayActivity extends FragmentActivity {
    ...
    public void onCreate(Bundle stateBundle) {
        ...
        super.onCreate(stateBundle);
        ...
        // The filter's action is BROADCAST_ACTION
        IntentFilter statusIntentFilter = new IntentFilter(
                Constants.BROADCAST_ACTION);

        // Adds a data filter for the HTTP scheme
        statusIntentFilter.addDataScheme("http");
        ...

หากต้องการจดทะเบียน BroadcastReceiver และ IntentFilter ในระบบ รับอินสแตนซ์ LocalBroadcastManager และตั้งชื่อ registerReceiver() ข้อมูลโค้ดถัดไปนี้จะแสดงวิธีลงทะเบียน BroadcastReceiver และIntentFilter:

Kotlin

        // Instantiates a new DownloadStateReceiver
        val downloadStateReceiver = DownloadStateReceiver()
        // Registers the DownloadStateReceiver and its intent filters
        LocalBroadcastManager.getInstance(this)
                .registerReceiver(downloadStateReceiver, statusIntentFilter)
        ...

Java

        // Instantiates a new DownloadStateReceiver
        DownloadStateReceiver downloadStateReceiver =
                new DownloadStateReceiver();
        // Registers the DownloadStateReceiver and its intent filters
        LocalBroadcastManager.getInstance(this).registerReceiver(
                downloadStateReceiver,
                statusIntentFilter);
        ...

BroadcastReceiver รายการเดียวสามารถจัดการออบเจ็กต์การออกอากาศ Intent ได้มากกว่า 1 ประเภท โดยแต่ละประเภทจะมีการดำเนินการของตนเอง ฟีเจอร์นี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้ จะใช้โค้ดที่แตกต่างกันสำหรับการกระทำแต่ละอย่าง โดยไม่ต้องกำหนดแท็ก BroadcastReceiver สำหรับการดำเนินการแต่ละรายการ หากต้องการคำจำกัดความอื่น IntentFilter ในราคาเดียวกัน BroadcastReceiver สร้าง IntentFilter และ โทรซ้ำเพื่อ registerReceiver() เช่น

Kotlin

        /*
         * Instantiates a new action filter.
         * No data filter is needed.
         */
        statusIntentFilter = IntentFilter(ACTION_ZOOM_IMAGE)
        // Registers the receiver with the new filter
        LocalBroadcastManager.getInstance(this)
                .registerReceiver(downloadStateReceiver, statusIntentFilter)

Java

        /*
         * Instantiates a new action filter.
         * No data filter is needed.
         */
        statusIntentFilter = new IntentFilter(Constants.ACTION_ZOOM_IMAGE);
        // Registers the receiver with the new filter
        LocalBroadcastManager.getInstance(this).registerReceiver(
                downloadStateReceiver,
                statusIntentFilter);

การส่งการประกาศ Intent ไม่เริ่มหรือกลับมาดำเนินต่อ Activity BroadcastReceiver สำหรับ Activity รับและประมวลผล Intent ออบเจ็กต์แม้กระทั่ง เมื่อแอปอยู่ในเบื้องหลัง แต่ไม่ได้บังคับแอปให้ทำงานในเบื้องหน้า หากคุณ ต้องการแจ้งให้ผู้ใช้ทราบเกี่ยวกับเหตุการณ์ที่เกิดขึ้นในเบื้องหลังขณะที่แอปของคุณไม่อยู่ มองเห็นได้ ให้ใช้ Notification ไม่เริ่ม Activity เพื่อตอบสนองต่อการแจ้งเตือนที่เข้ามาใหม่ Intent