首先你需要设置一个接收器来观看wifi连接以查看它们何时有数据,你还可以检查正常的3g / 4g连接,并为此制作一个广播接收器. todo这个让用一个广播接收器来进行连接状态的改变.把这样的东西放在应用程序标签的清单中
现在我们需要制作清单中定义的接收器
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//here, check that the network connection is available. If yes, start your email service. If not, stop your email service.
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
if (info.isConnected()) {
//start service
Intent intent = new Intent(this, ItemServiceManager.class);
startService(intent);
}
else {
//stop service
Intent intent = new Intent(this, ItemServiceManager.class);
stopService(intent);
}
}
}
}
这样做是在android领域放置一个名为NetworkChangeReceiver的大胖天线,当android有关于数据连接状态的变化的话时,可以很好地监听.
现在你需要构建你应该从数据库读取的ItemServiceManager.class(它也应该扩展Service.它应该选择数据库中最旧的项目,(通过电子邮件发送,发送文本,上传到服务器,等等),如果连接成功然后从数据库中删除该项目,并加载下一个最旧的项目.如果没有更多,然后关闭服务和广播接收器.
如果您有连接并且用户需要发送更多数据,则将其添加到数据库,然后确保服务已启动.也许通知它它应该仔细检查数据库(几秒钟后),然后决定它可以关闭,因为没有任何东西.
这是您可以禁用广播接收器的方法.
PackageManager packageManager = context.getPackageManager();
ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class);
packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
当要上传新项目时,如果没有网络连接,则应将电子邮件保存到数据库,并且应该开始广播接收器以了解互联网何时返回,以便知道何时上传.你可以像这样启动它.
PackageManager packageManager = context.getPackageManager();
ComponentName componentName = new ComponentName(context, NetworkChangeReceiver.class);
packageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
重点是,当您存储要上传的内容但由于没有数据连接而无法上传时,您只关心连接广播.当您无需上传任何内容时,请不要通过保持接收器/服务来浪费处理和电池.当你有电子邮件等待时,然后启动你的broadcastreceiver,知道什么时候有数据连接,以便你可以开始上传.
我认为没有人会为你写一个完整的解决方案,希望这足以让你顺利上路.
编辑:
您可以做的另一件事是让服务器允许接受您的项目数组,这样您就可以在获得有效连接时立即上传所有项目.一般来说,如果每个项目都相当小,你会这样做.但是如果你要上传图片或视频或任何大的,最好一次一个.