1

如您所知, sendStickyBroadcast 方法现在已弃用。如何更换它?

当然我可以使用 sendBroadcast 但它不会粘。

4

3 回答 3

1

您可以使用事件总线,以下是一些最常用的库。- https://github.com/greenrobot/EventBus - http://square.github.io/otto/ - https://blog.kaush.co/2014/12/24/implementing-an-event-bus- with-rxjava-rxbus/(如何使用 Rx 作为事件总线)

另一种方法是创建一个监听广播的类,然后存储它检索到的最后一个状态。在我看来,这种方法并不理想。

于 2017-10-19T18:44:28.737 回答
0

也许可以使用JobScheduler
安排定期作业,
该作业将发送广播。

“keep alive”服务,它将发送 periodoc 广播。

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Intent;


import static my.UtilsLocation.PACKAGE_NAME;

/**
 * JobService to be scheduled by the JobScheduler.
 * start another service
 */
public class KeepAliveBroadcastJobService extends JobService {

    public static final String INTENT_ACTION_KEEP_ALIVE = PACKAGE_NAME + ".action.KEEPALIVE";

    @Override
    public boolean onStartJob(JobParameters params) {
        // send recurring broadcast
        final Intent intent = new Intent(getApplicationContext());
        intent.setAction(INTENT_ACTION_KEEP_ALIVE);
        sendBroadcast(intent);
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return true;
    }

}

一个实用程序,用于定期安排保持活动的作业。

import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.util.Log;

import java.util.concurrent.atomic.AtomicBoolean;

public class UtilsKeepAlive {

    private static final String TAG = UtilsKeepAlive.class.toString();

    private static AtomicBoolean isKeepAliveOn = new AtomicBoolean(false);

    private static final int INTERVAL_MILLIS = 600000; // 10 min
    private static final int FLEX_MILLIS = 60000; // 1 min

    public static void enableKeepAlive(Context context) {
        // if already on
        if (isKeepAliveOn.get()) return;

        Log.i(TAG, "Keep alive job scheduled");

        ComponentName serviceComponent = new ComponentName(context, KeepAliveBroadcastJobService.class);
        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); //Require any network
        builder.setRequiresCharging(false);
        builder.setPeriodic(INTERVAL_MILLIS, FLEX_MILLIS);

        JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
        jobScheduler.schedule(builder.build());

        //we have scheduled the keep alive
        isKeepAliveOn.set(true);
    }
}

周期性的“保持活动”作业——例如可以在广播中调度,在 BOOT_COMPLETED 上。

@Override
public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "BroadCastReceiver got the location.");

    final String action = intent.getAction();

    switch (action) {
        case INTENT_ACTION_BOOT_COMPLETED:
            Log.i(TAG, "Received a BootCompleted");
            UtilsKeepAlive.enableKeepAlive(context);
            break;

我已经使用本教程来解释 JobScheduler: https ://www.vogella.com/tutorials/AndroidTaskScheduling/article.html

于 2020-11-15T21:16:59.207 回答
-1

这是 Google 对 Sticky Broadcasts 为何被弃用的解释。

不应使用粘性广播。它们不提供安全性(任何人都可以访问它们)、不提供保护(任何人都可以修改它们)以及许多其他问题。推荐的模式是使用非粘性广播来报告发生了变化,并使用另一种机制让应用程序在需要时检索当前值。

希望这可以帮助。

于 2017-06-06T11:49:33.483 回答