我正在开发一个针对android nougat的Android应用程序。如果连接到Internet,它应该在后台线程中执行远程sql到本地数据库同步。我尝试使用广播接收器来检测连接,但它没有在Android N上触发。我怎么能在后台执行此操作(检查互联网可用性)?一个例子很有帮助
我试过这个
Android清单
<receiver android:name=".NetworkChangeReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
NetworkChangeReciever.java
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
Toast.makeText(context,"Internet state changed",Toast.LENGTH_LONG).show();
}
答案 0 :(得分:0)
private void registerInternetReceiver()
{
if (this.internetReceiver != null) return;
this.internetReceiver = new BroadcastReceiver()
{
@Override
public void onReceive (Context context, Intent intent)
{
if (isInternetAvailable()) {
Log.i ("Tag", "internet status online");
// write ur logic here
}
else
Log.i ("Tag", "internet status offline");
}
};
IntentFilter filter = new IntentFilter();
filter.addAction (ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver (internetReceiver, filter);
}
private boolean isInternetAvailable()
{
try
{
return (Runtime.getRuntime().exec ("ping -c 1 google.com").waitFor() == 0);
}
catch (Exception ex)
{
ex.printStackTrace();
}
return false;
}
//使用上面的代码
答案 1 :(得分:0)
连接动作应该用于nougat
IntentFilter intentFilter = new IntentFilter();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
{
//For Nougat
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
} else
{
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_CHANGE));
}
registerReceiver(new NetworkConnectionReceiver(), intentFilter);
答案 2 :(得分:0)
我得到了一个问题的答案。
带有动作的广播接收器
在清单中注册的<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
将不会在android N中触发。但是可以以编程方式注册广播并使其正常工作。但是当应用程序被杀时它将不起作用。
然后在我的情况下,我有两个选项(这就是我的想法),使用
安排同步操作GCM网络管理员
或强>
作业调度程序
作业调度程序的问题在于它仅适用于API级别21,但它并不需要Google Play服务才能工作。另一方面,GCM网络管理器具有向后兼容性,但需要谷歌播放服务才能运行。
然后我访问了Intelligent Job Scheduling,然后他们说,请Firebase Job dispatcher,
Firebase JobDispatcher支持将Google Play服务用作 调度(运行)作业的实现,但库也 允许您定义和使用其他实现:例如,您 可能决定使用JobScheduler或编写自己的自定义代码。 由于这种多功能性,我们建议您使用此Firebase 如果您的应用针对的Android版本低于5.0,则为JobDispatcher (API级别21)。
我接受了这个建议, 这就是我做的,
创建了一个服务(SyncService.java),用于执行同步作业
将该服务添加到清单
<service
android:exported="false"
android:name=".SyncService">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
在我的活动中,创建并执行了一个要同步的作业
Job syncJob=jobDispatcher.newJobBuilder()
.setService(SyncService.class)
.setRecurring(true)
.setLifetime(Lifetime.FOREVER)
.setRecurring(true)
.setLifetime(Lifetime.FOREVER)
.setTrigger(Trigger.executionWindow(3,600))
.setConstraints(Constraint.ON_ANY_NETWORK) //does job when network is available
.setReplaceCurrent(true)
.setTag("syncService")
.build();
jobDispatcher.mustSchedule(syncJob);
这适用于后台。