在后台线程上检查Android nougat的互联网连接
我正在开发一款针对android nougat的android应用程序。如果连接到互联网,它应该在后台线程中对本地数据库同步执行远程SQL。我试过使用广播接收机来检测连通性,但它并没有在android N上发射。我怎么能在背景中做到这一点(检查网络可用性)?一个例子是有益的在后台线程上检查Android nougat的互联网连接
我想这
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();
}
我得到了我的问题的答案。
采取行动的广播接收器 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
,在清单中注册不会在android N中触发。但是可以通过编程注册广播并使其工作。但是当应用程序被杀时它不会起作用。
然后在我的情况,我有两个选择(这就是我的想法),安排与
-
GCM网络经理
OR
-
作业调度
同步操作
该pr与工作调度程序相关的是它只能在API 21级以上工作,但它不需要Google Play服务工作。另一方面,GCM网络经理向后兼容,但需要谷歌播放服务运行。
然后我参观了Intelligent Job Scheduling,他们说,去Firebase Job dispatcher,
火力地堡JobDispatcher支持使用谷歌的Play服务,因为一个 实施调度(运行)的工作,但是库也 让你定义和使用其他实现:例如,您可能会决定使用JobScheduler或编写您自己的自定义代码。 由于这种多功能性,如果您的应用的目标版本低于5.0 (API等级21),我们建议您使用此Firebase JobDispatcher。
我就把他的意见, 这是我做过什么,
创建一个服务(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);
而且这部作品在背景。
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;
}
//使用上面的代码
它适用于我的应用程序处于活动状态。但是,当我退出我的应用程序或通过清除活动任务,然后连接/断开互联网,它不能正常工作 –
Connectivi ty动作应该用于牛轧糖
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);
我不认为它会工作 –
没有检查它对我的工作很好 –
是,我检查它不工作,如果遇害将检查一些其他解决方案 –
检查了这可能会帮助你http://stackoverflow.com/a/42229749/5610842 – RaghavPai
如何使用该类?我想在用户启用互联网时触发一些操作,即使我的应用程序不活动。如何监控?对不起,我是一个noob –