检查互联网连接,每30分钟
你好,我想打一个应用程序,将检查每30分钟背景的互联网连接,如果是的话,将一些非常小的JSON数据发送到服务器。检查互联网连接,每30分钟
不知道,如果这样做的权利,但现在我有:
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();
}
}
}
而且在表现我在最后postition的是
<?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
来安排你的下一个“唤醒”在30分钟内。你可以找到很多例子,如何在网络中使用AlarmManager
。 - 您可能需要一种方法来安排设备引导后第一次“唤醒”您的服务。为此,您需要清单中的
BroadcastReceiver
,该清单已注册接收ACTION_BOOT_COMPLETED
广播。这要求您具有RECEIVE_BOOT_COMPLETED
权限。这个例子也遍布整个网络。
你好,请你能更具体如何落实AlarmManager在onHandleIntent(),我已经有了?我在网络上的所有例子中都很迷茫。 – comingage
@ N.tsrg 1.您需要使用'PendingIntent.getService()','不PendingIntent.getBroadcast()',因为其目的是为服务类。 2.警报间隔以毫秒为单位。现在你有'1000 * 30',这是30秒,而不是30分钟。你需要乘以60得到30分钟。 3.我不认为你需要'setRepeating()',因为每次服务运行它应该安排下一次唤醒。我认为'setExact()'(或者'set()'在API 19以下)就足够了。那有意义吗? – Karakuri
不幸的是我做的改变是有道理的,但它没有显示烤面包。也许我是在错误的课上做的。 30秒是有目的的,看看它是否有效,当我关掉互联网时发生变化。如果服务声明在onHandleIntent之下并且只是在它中调用,并且对于alarmManager是相同的,将会有所帮助吗? – comingage
所以你想做什么?你想发送数据还是要检查连接? –
我想发送数据。 – comingage
如果时间到了,并且没有连接,该怎么办?你想发送的数据怎么样? –