gpt4 book ai didi

android - 在 sleep 时打开 Android 上的互联网

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:59 25 4
gpt4 key购买 nike

我有一个 Android 应用程序需要同步到互联网,但一旦手机进入休眠状态,我就无法访问互联网。它只发生在用户使用“电池模式”时,即 15 分钟后关闭数据时。我编写了一个测试应用程序并打开了数据,但它仍然连接到服务器。

我尝试了什么:

  • 当我手动关闭数据时,应用程序会打开它并且可以正常工作
  • 我也试过 WakeLock,但没有用。
  • 即使手机进入休眠状态数小时,闹钟也会按预期工作

在摩托罗拉 Atrix Android 2.3.3 上测试。我不能依赖 Wifi。在现实生活中,它每周都会同步。我们怎样才能让它成为可能?

报警管理器:

alarm_manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
alarm_manager.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), 15000, pending);

报警接收器:

public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Log.d("MYTAG", "RECEIVED getMobileDataEnabled: " + getMobileDataEnabled(context));
if (!isOnline(context)) {
Log.d("MYTAG", "NO INET");
if (turnOnInet(context)) {
Log.d("MYTAG", "INET IS ON");
}
}

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://xxx.xxx.xxx.xxx/ping/pong/moto/");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("short_code", "ROFL"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httpclient.execute(httppost);
Log.d("MYTAG", "POST FINISHED");
}
catch (Exception e) {
Log.e("MYTAG", "MYTAG", e);
}
}

public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager)context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null){
Log.d("MYTAG", "isAvailable: "+netInfo.isAvailable());
}
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}

public boolean turnOnInet(Context context) {
ConnectivityManager mgr = (ConnectivityManager)context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (mgr == null) {
Log.d("MYTAG", "ConnectivityManager == NULL");
return false;
}
try {
Method setMobileDataEnabledMethod = mgr.getClass().getDeclaredMethod("setMobileDataEnabled", boolean.class);
if (null == setMobileDataEnabledMethod) {
Log.d("MYTAG", "setMobileDataEnabledMethod == null");
return false;
}
setMobileDataEnabledMethod.invoke(mgr, true);
}
catch(Exception e) {
Log.e("MYTAG", "MYTAG", e);
return false;
}
return true;
}


private boolean getMobileDataEnabled(Context context) {
ConnectivityManager mgr = (ConnectivityManager)context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (mgr == null) {
Log.d("MYTAG", "getMobileDataEnabled ConnectivityManager == null");
return false;
}
try {
Method method = mgr.getClass().getMethod("getMobileDataEnabled");
return (Boolean) method.invoke(mgr);
} catch (Exception e) {
Log.e("MYTAG", "MYTAG", e);
return false;
}
}
}

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

最佳答案

首先,您需要将 HttpPost 代码从 BroadcastReceiver 中取出并放入 IntentService 中。 从不在主应用程序线程上执行网络 I/O,并且在主应用程序线程上调用 onReceive()。例如,如果您花费的时间过长,Android 将在您的互联网操作中途终止您的代码。

其次,给定IntentService,您需要使用WakeLock。这可能会引导您使用 my WakefulIntentService ,它处理这两个问题。或者,使用 WakefulBroadcastReceiver ,目的相同。

第三,删除turnOnInet()getMobileDataEnabled()。您不需要它们,它们不可靠,尤其是 turnOnInet() 对用户不利——如果用户想要打开移动数据,他们早就打开了。

现在,考虑到所有这些,在 IntentService()onHandleIntent() 中(或 doWakefulWork() WakefulIntentService),如果您没有立即连接到 Internet,作为临时解决方法,请 SystemClock.sleep() 等待一秒钟,然后重试,在一段时间内重复几次环形。如果您发现稍后可以访问 Internet,那么您可以考虑变得更复杂(例如,监听连接更改广播而不是轮询,尽管这会使您远离 WakefulIntentService 并进入常规 Service 带有您自己的后台线程和用于 WakeLock 管理的状态机)。或者,坚持使用 sleep() —— 如果您将此后台线程占用几秒钟,世界末日就不太可能了。但是,如果您在适度的时间后没有连接,请不要无限期地尝试,因为有很多原因可能导致您无法连接,包括 Android 4.0+ 上用户驱动的带宽管理。

关于android - 在 sleep 时打开 Android 上的互联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com