我有一个可以检测互联网是否可用的应用程序。 我已经更改了后退按钮的行为,以避免在按下时关闭应用程序。我面临的问题是,当我运行4G或WIFI并运行该应用程序时,它检测到互联网可用,但是,当我按“后退”按钮时,该应用程序被置于后台,并且不再检测到互联网通过它。
我注意到,如果删除清单文件中的权限,则该应用程序可以正常运行,可以在运行时和置于后台时检测到Internet,但是我需要这些权限才能稍后发出http发布请求。
对此有任何帮助吗?
谢谢。
MainActivity.java
public class MainActivity extends AppCompatActivity {
Timer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
@Override
public void onBackPressed() {
this.moveTaskToBack(true);
}
private void init() {
timer = new Timer();
Tasker task = new Tasker(MainActivity.this, timer);
task.execute();
}
}
Tasker .java
public class Tasker extends AsyncTask<Void,Void,String> {
final Handler handler = new Handler();
static Timer timer;
Context context;
Toast toast;
private TimerTask doAsynchronousTask;
public Tasker(MainActivity context, Timer timer) {
this.timer = timer;
this.context = context;
}
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(Void... voids) {
doTimerTask();
return null;
}
@Override
protected void onPostExecute(String response) {
}
private void showToast(String message){
toast = Toast.makeText(context, message, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
if(!((Activity) context).isFinishing()){
toast.show();
}
}
private void doTimerTask() {
doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@SuppressWarnings("unchecked")
public void run() {
if(haveNetworkConnection()){
showToast("Online");
}else{
showToast("Offline");
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 10000);
}
private boolean haveNetworkConnection() {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
return isConnected;
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.e.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
答案 0 :(得分:0)
实际上,这可能不是您想要的答案,但是我认为有一种更简单的方法可以使用广播接收器来完成您真正想做的事情。您无需使用计时器检查网络状态。这是link
答案 1 :(得分:0)
我建议您使用WorkManager
或AlarmManager
甚至是Services
进行与背景相关的定期任务。
使用Timer
-AsyncTask
组合不是可行的方法,并且可能导致许多问题,其中之一就是一旦它在后台运行,很容易被Android终止。
我的首选是WorkManager
,因为它很好地为您处理了任务的条件,例如,如果您只想在有互联网连接的情况下启动任务,则只需添加一个{{3} }这样的工作要求
Constraint networkConstraint = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
workRequest.setConstraints(constraints)
仅在连接网络后才会执行您的任务。顺便说一句,重启后无需像AlarmManagers
一样手动重置它们。
但是,它有一个缺点,其中之一就是周期性请求只能每15分钟发生一次,您可以通过在每个周期性请求中设置更多Work Constraint
并以较小的间隔来规避(尽管不建议这样做)延迟的开始时间。
无论如何,请停止使用您现在正在使用的AsyncTask
方法,并使用Android批准的一种“合法”方法来执行后台任务,我建议WorkManager
,但是根据您的情况,您可以可以选择任何您喜欢的方法,只要它可以在后台工作即可。