每 30 分钟检查一次后台服务中的互联网连接
check internet connection in background service every 30 min
你好,我想制作一个应用程序,每 30 分钟在后台检查一次互联网连接,如果是这样,它会向服务器发送一些非常小的 json 数据。
不知道这样做是否正确,但现在我有:
package com.example.lenovotp.sender;
import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;
import java.util.Calendar;
public class MyClass extends IntentService{
private static final String TAG = "com.example.lenovotp.sender";
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
Calendar calendar = Calendar.getInstance();
public MyClass(){
super("");
}
@Override
protected void onHandleIntent(Intent intent) {
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
intent = new Intent(this, MyClass.class);
PendingIntent alarmIntent = PendingIntent.getService(this, 0, intent, 0);
alarmMgr.set(AlarmManager.RTC_WAKEUP,
1000 * 30, alarmIntent);
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
//boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
if(isConnected!=false){
Toast.makeText(this, "Network is avail!", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Network is NOT avail!", Toast.LENGTH_LONG).show();
}
}
}
在清单中,我在最后一个职位中的是
<?xml version="1.0" encoding="utf-8"?>
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyClass"/>
</application>
并且在 MainActivity 中
package com.example.lenovotp.sender;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,MyClass.class);
startService(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
所以现在我不知道如何:
- 即使应用程序未被 运行 或被用户破坏也能正常运行。
- 它每 30 分钟检查一次连接,如果是,它会向服务器发送一些数据。
提前致谢。
已更新
几件事:
- 子类
IntentService
而不是 Service
。服务 运行 在主 (UI) 线程上,但是 IntentService
将在后台线程(在 onHandleIntent()
中)完成它的工作,并且它会在完成后自动停止工作。
- 在您的服务中,使用
AlarmManager
安排您的下一个 "wakeup" 在 30 分钟后。您可以在整个网络上找到大量如何使用 AlarmManager
的示例。
- 您可能需要一种方法来安排设备启动后的第一个 "wakeup" 服务。为此,您需要在您的清单中注册接收
ACTION_BOOT_COMPLETED
广播的 BroadcastReceiver
。这需要您拥有 RECEIVE_BOOT_COMPLETED
权限。这样的例子在网络上也随处可见。
你好,我想制作一个应用程序,每 30 分钟在后台检查一次互联网连接,如果是这样,它会向服务器发送一些非常小的 json 数据。
不知道这样做是否正确,但现在我有:
package com.example.lenovotp.sender;
import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;
import java.util.Calendar;
public class MyClass extends IntentService{
private static final String TAG = "com.example.lenovotp.sender";
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
Calendar calendar = Calendar.getInstance();
public MyClass(){
super("");
}
@Override
protected void onHandleIntent(Intent intent) {
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
intent = new Intent(this, MyClass.class);
PendingIntent alarmIntent = PendingIntent.getService(this, 0, intent, 0);
alarmMgr.set(AlarmManager.RTC_WAKEUP,
1000 * 30, alarmIntent);
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
//boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
if(isConnected!=false){
Toast.makeText(this, "Network is avail!", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Network is NOT avail!", Toast.LENGTH_LONG).show();
}
}
}
在清单中,我在最后一个职位中的是
<?xml version="1.0" encoding="utf-8"?>
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyClass"/>
</application>
并且在 MainActivity 中
package com.example.lenovotp.sender;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,MyClass.class);
startService(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
所以现在我不知道如何:
- 即使应用程序未被 运行 或被用户破坏也能正常运行。
- 它每 30 分钟检查一次连接,如果是,它会向服务器发送一些数据。
提前致谢。
已更新
几件事:
- 子类
IntentService
而不是Service
。服务 运行 在主 (UI) 线程上,但是IntentService
将在后台线程(在onHandleIntent()
中)完成它的工作,并且它会在完成后自动停止工作。 - 在您的服务中,使用
AlarmManager
安排您的下一个 "wakeup" 在 30 分钟后。您可以在整个网络上找到大量如何使用AlarmManager
的示例。 - 您可能需要一种方法来安排设备启动后的第一个 "wakeup" 服务。为此,您需要在您的清单中注册接收
ACTION_BOOT_COMPLETED
广播的BroadcastReceiver
。这需要您拥有RECEIVE_BOOT_COMPLETED
权限。这样的例子在网络上也随处可见。