java - 应用小部件在某些设备中无法连接到服务器
问题描述
我对某些设备有一个特殊的问题。
我的问题是:我正在开发一个带有应用程序小部件的应用程序,该应用程序和应用程序小部件必须连接到服务器。应用程序在设备中完美连接到服务器,但应用程序小部件无法连接到某些设备中的服务器。
应用小部件提供者类:
public class WidgetOne extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
ComponentName componentName = new ComponentName(context, WidgetOne.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_weather);
Intent intent = new Intent(context, WidgetOne.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if(!Prefe.builder().getBool("isFirstRun",true)){
showLoading(context, remoteViews);
new getResponseAsyncWidget1(context, remoteViews).execute();
}
remoteViews.setOnClickPendingIntent(R.id.root_refresh_widget, pendingIntent);
remoteViews.setOnClickPendingIntent(R.id.img_refresh_wedget_1, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
网络类:
public class Networking {
OkHttpClient okHttpClient;
public Networking() {
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.callTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.build();
}
public String get(String url){
Request request = new Request.Builder()
.url(url)
.build();
try {
Response response = okHttpClient.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
return "error";
}
}
异步任务类:
private class getResponseAsyncWidget1 extends AsyncTask<String, Integer, String> {
String url = "//url"
RemoteViews remoteViews;
Context context;
public getResponseAsyncWidget1(Context context, RemoteViews remoteViews) {
this.context = context;
this.remoteViews = remoteViews;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
Networking networking = new Networking();
String response = networking.get(url);
return response; // return "error" in some devices Although the internet is connected
}
@Override
protected void onPostExecute(String response) {
super.onPostExecute(response);
if (response.matches("error")) {
// do something
AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, WidgetOne.class), remoteViews);
}
else {
// do something
AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, WidgetOne.class), remoteViews);
}
}
}
我的问题是response
在某些设备返回"error"
虽然互联网已连接
解决方案
当手机的电源模式打开时,系统不提供后台运行所需的服务。要解决这个问题,可以使用这段代码:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent();
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
}
推荐阅读
- typescript - 为赛普拉斯指定 tsconfig.json 位置
- sql - 在 sequelize 中定义与自引用表的 belongsToMany 关系
- php - DKIM“失败”(签名错误)
- reactjs - 对齐文本和图像的问题,反应js material-ui
- javascript - 如何使用 jasmine 测试 ngOnInit 中的 settimeout 函数
- python - 使用 Nginx 服务器时出现内存错误
- excel - VBA - 将工作表导出为 CSV 而不在 CSV 中舍入值
- python - 泡菜没有安装在Windows中
- java - org.hibernate.id.IdentifierGenerationException: 试图从空的一对一属性分配 id (hibernate+postgres)
- swift - 如何执行一个又一个功能?