簡體   English   中英

每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);
    }
}

所以現在我不知道如何:

  1. 即使應用未在運行或被用戶破壞,也可以使其正常工作。
  2. 它每30分鍾檢查一次連接,如果有,它將向服務器發送一些數據。

提前致謝。

更新

一些東西:

  1. 子類IntentService而不是Service 服務在主(UI)線程上運行,但是IntentService將在后台線程(在onHandleIntent() )中完成其工作,並且在完成工作后會自動停止自身。
  2. 在您的服務中,使用AlarmManager安排30分鍾內的下一次“喚醒”。 您可以在網絡上找到許多示例如何使用AlarmManager
  3. 您可能需要一種在設備啟動后安排服務的第一次“喚醒”的方法。 為此,您需要在清單中注冊一個BroadcastReceiver以便接收ACTION_BOOT_COMPLETED廣播。 這要求您具有RECEIVE_BOOT_COMPLETED權限。 網絡上也有此類示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM