【问题标题】:check internet connection in background service every 30 min每 30 分钟检查一次后台服务中的互联网连接
【发布时间】:2015-08-17 05:51:55
【问题描述】:

您好,我想制作一个应用程序,每 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 分钟检查一次连接,如果是,它会向服务器发送一些数据。

提前致谢。

更新

【问题讨论】:

  • 那么你想做什么?您要发送数据还是要检查连接?
  • 我要发送数据。
  • 如果时间到了但没有连接怎么办?你想发送的数据呢?
  • 存储在sd卡中

标签: android internet-connection background-service


【解决方案1】:

一些事情:

  1. 子类IntentService 而不是Service。服务在主 (UI) 线程上运行,但 IntentService 将在后台线程(onHandleIntent())中完成其工作,并在完成工作后自动停止。
  2. 在您的服务中,使用AlarmManager 在 30 分钟内安排您的下一次“唤醒”。您可以在网上找到大量使用 AlarmManager 的示例。
  3. 您可能需要一种方法来安排设备启动后服务的第一次“唤醒”。为此,您需要在您的清单中注册一个BroadcastReceiver,以接收ACTION_BOOT_COMPLETED 广播。这需要您拥有RECEIVE_BOOT_COMPLETED 权限。这样的例子也遍布网络。

【讨论】:

  • 嗨,您能否更具体地了解如何在我已经拥有的 onHandleIntent() 中实现 AlarmManager?我在网络中的所有示例中都迷失了。
  • @N.tsrg 1. 您需要使用PendingIntent.getService(),而不是PendingIntent.getBroadcast(),因为意图是针对您的服务类的。 2. 报警间隔以毫秒为单位。现在你有1000 * 30,它是 30 秒,而不是 30 分钟。您需要将其乘以 60 才能得到 30 分钟。 3. 我认为你不需要setRepeating(),因为每次服务运行时它都应该安排下一次唤醒。我认为setExact()(或 API 19 以下的set())就足够了。这有意义吗?
  • 不幸的是,我做了有意义的更改,但它没有显示吐司。也许我在错误的课堂上做这件事。有 30 秒的目的是为了查看它是否有效并在我关闭互联网时发生变化。如果在 onHandleIntent 下方声明服务并在其中调用它会有所帮助,对于 alarmManager 也是如此?
  • @N.tsrg 我没有在您的 AndroidManifest.xml 中看到您的服务声明。
  • 好吧,我错过了。我的错。现在我不明白它的行为。我已关闭互联网,运行应用程序,它安装并看到 Toast “无效”,然后我向下滑动并在栏中打开互联网并向上滑动到我的应用程序,即使等待更长时间,我 Toast 也不会更改为“网络可用”,如果我按下主页按钮,也是如此。但是,如果我销毁应用程序,它会将 Toast 更改为更正一个。然后我改变连接并等待,但没有任何改变。你能在这方面给我更多建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
相关资源
最近更新 更多