Android 如何使用FirebaseJobDispatcher可靠地替换连接

Android 如何使用FirebaseJobDispatcher可靠地替换连接,android,android-jobscheduler,firebase-job-dispatcher,Android,Android Jobscheduler,Firebase Job Dispatcher,我的应用程序的目标是安卓7,最低SDK为安卓4 因此,收听CONNECTIVITY\u CHANGE(即使应用程序被关闭)不再有效。我想做的是 即使我的主应用程序被关闭,当互联网连接从“不可用”变为“可用”时,我也希望启动警报广播接收器 我尝试用以下代码实现 MainActivity.java 但是, MyJobService.java 然而,上面的代码并不可靠。我是如何测试的 退出我的应用程序 通过使用“强制停止”的设置明确终止我的应用程序 关掉互联网 打开互联网 等几分钟MyJobServi

我的应用程序的目标是安卓7,最低SDK为安卓4

因此,收听
CONNECTIVITY\u CHANGE
(即使应用程序被关闭)不再有效。我想做的是

  • 即使我的主应用程序被关闭,当互联网连接从“不可用”变为“可用”时,我也希望启动警报广播接收器
  • 我尝试用以下代码实现

    MainActivity.java 但是,

    MyJobService.java 然而,上面的代码并不可靠。我是如何测试的

  • 退出我的应用程序
  • 通过使用“强制停止”的设置明确终止我的应用程序
  • 关掉互联网
  • 打开互联网
  • 等几分钟<代码>MyJobService从未执行
  • 是否有可靠的方法使用FirebaseJobDispatcher替换连接\u可靠更改?


    我已经通过了,但我仍然找不到一种方法使其可靠地工作。

    不确定如何通过FirebaseJobDispatcher检测连接变化,但对于我使用广播的相同情况

    public class ConnectivityStateReceiver extends BroadcastReceiver {
    String TAG = "MyApp";
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
        Intent serviceIntent = new Intent(context, NetworkService.class);
    
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm == null) {
            return;
        } else if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected()) {
            Log.e(TAG, "Connected!");
            context.startService(serviceIntent);
        } else {
            Log.e(TAG, "Not Connected!");
            context.stopService(serviceIntent);
        }
    }
    

    }

    您好,自从安卓7以来有了变化<代码>针对Android 7.0(API级别24)及更高版本的应用程序如果在其清单中声明了广播接收器,则不会接收连接性动作广播。-作业调度器执行定期作业。问题是:为什么你的应用程序需要监控连接的变化?根据答案,你必须重新思考你的应用程序的工作方式。我们有一个耗时的股市预警服务。我们只想在互联网可用的时候运行这样的股市预警服务。我们希望避免在互联网不可用时运行它。在运行股票预警服务之前,我们不希望定期运行N分钟检查,以检查互联网是否可用。事实上,这不是电池效率。您应该在案例中使用Firebase推送通知。一旦网络恢复,它们将自动交付。不太理想的选择是使用JobScheduler每n小时安排一次更新服务,添加网络条件。这取代了AlarmManager调用和收听连接广播。经过阅读和一些实验,我意识到很难针对不同版本的Android正确实现。我选择使用evernote中的库-到目前为止效果很好。
    import android.content.Context;
    
    import com.firebase.jobdispatcher.JobParameters;
    import com.firebase.jobdispatcher.JobService;
    
    import org.yccheok.jstock.gui.JStockApplication;
    
    /**
     * Created by yccheok on 21/5/2017.
     */
    
    public class MyJobService extends JobService {
        @Override
        public boolean onStartJob(JobParameters jobParameters) {
            Context context = this.getApplicationContext();
    
            android.util.Log.i("CHEOK", "Internet -> " + Utils.isInternetAvailable(context));
    
            // Answers the question: "Is there still work going on?"
            return false;
        }
    
        @Override
        public boolean onStopJob(JobParameters jobParameters) {
            // Answers the question: "Should this job be retried?"
            return true;
        }
    }
    
    public class ConnectivityStateReceiver extends BroadcastReceiver {
    String TAG = "MyApp";
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
        Intent serviceIntent = new Intent(context, NetworkService.class);
    
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm == null) {
            return;
        } else if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected()) {
            Log.e(TAG, "Connected!");
            context.startService(serviceIntent);
        } else {
            Log.e(TAG, "Not Connected!");
            context.stopService(serviceIntent);
        }
    }