【发布时间】:2017-09-11 19:30:57
【问题描述】:
首先:我知道ConnectivityManager.CONNECTIVITY_ACTION 已被弃用,我知道如何使用connectivityManager.registerNetworkCallback。此外,如果阅读有关 JobScheduler 的信息,但我不完全确定我是否正确。
我的问题是我想在手机连接/断开网络时执行一些代码。当应用程序在后台时也应该发生这种情况。从 Android OI 开始,如果我想在后台运行我想要避免的服务,则必须显示通知。
我尝试使用 JobScheduler/JobService API 获取有关手机何时连接/断开连接的信息,但它只在我安排它的时间执行。对我来说,当这样的事件发生时,我似乎无法运行代码。有没有办法实现这一目标?我可能只需要稍微调整一下我的代码吗?
我的工作服务:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class ConnectivityBackgroundServiceAPI21 extends JobService {
@Override
public boolean onStartJob(JobParameters jobParameters) {
LogFactory.writeMessage(this, LOG_TAG, "Job was started");
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
if (activeNetwork == null) {
LogFactory.writeMessage(this, LOG_TAG, "No active network.");
}else{
// Here is some logic consuming whether the device is connected to a network (and to which type)
}
LogFactory.writeMessage(this, LOG_TAG, "Job is done. ");
return false;
}
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
LogFactory.writeMessage(this, LOG_TAG, "Job was stopped");
return true;
}
我这样启动服务:
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName service = new ComponentName(context, ConnectivityBackgroundServiceAPI21.class);
JobInfo.Builder builder = new JobInfo.Builder(1, service).setPersisted(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).setRequiresCharging(false);
jobScheduler.schedule(builder.build());
jobScheduler.schedule(builder.build()); //It runs when I call this - but doesn't re-run if the network changes
清单(摘要):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.VIBRATE" />
<application>
<service
android:name=".services.ConnectivityBackgroundServiceAPI21"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
</application>
</manifest>
我想必须有一个简单的解决方案,但我找不到它。
【问题讨论】:
-
如果您不愿意在前台运行服务,那么您是正确的,您不能使用连接管理器。当连接发生变化时,您具体要做什么?
-
我正在尝试启动 VPNService(或用户可以配置它的 Activity)
-
您将
registerNetworkCallback()与PendingIntent一起使用,而不是NetworkCallback对象? -
我一直在回调中使用它。带有 PendingIntent 的调用看起来很有希望,我会研究一下。谢谢!
-
Firebase Job Dispatcher 具有逆向兼容性,因此您不必为不同版本编写和支持代码github.com/firebase/firebase-jobdispatcher-android
标签: android android-service android-8.0-oreo