检查用户的互联网连接以在其打开时发送通知的最佳方式是什么?

What is the best way checking users' internet connection to send notification when it is on?

我是发送通知的新手。我了解 AlarmManager 以及在 AlarmManager 触发时显示通知。我获取一些网站,从该网站收集信息并将它们插入我托管的数据库中。

我计划创建一个 android 应用程序,在用户连接到 Internet 后立即将其中一些插入的信息发送给他们。实际上,我真正想要实现的是像 Facebook、Twitter 或 Instagram 那样发送通知(你知道,当你打开连接时,评论、转推、点赞、提及等通知会在一分钟内发送)。我认为这可以通过在 AlarmManager 中使用后台任务每 2 或 5 分钟检查一次用户连接来完成,但它看起来不太适合电池。应该有一些更专业或更合乎逻辑的解决方案。你能告诉我实现这个的方法吗?

注意:我不需要连接控制代码。我只需要知道我应该选择检查哪个时间范围。我应该使用 alarmmanager 还是有其他东西可以在后台管理时间范围?

您可以通过添加这行代码来检查互联网连接,为了更好地理解,您应该创建所有活动的父级 class 并将此代码放在那里并扩展 Base Activity(Parent ) 在所有子活动中,每次都会在创建 activity 时执行。

public boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); }

试试下面的代码,希望它能解决你的问题。

供参考:https://github.com/oscarjiv91/Android-Check-Internet-Connection

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public class ConnectionService extends Service {

    // Constant
    public static String TAG_INTERVAL = "interval";
    public static String TAG_URL_PING = "url_ping";
    public static String TAG_ACTIVITY_NAME = "activity_name";

    private int interval;
    private String url_ping;
    private String activity_name;

    private Timer mTimer = null;

    ConnectionServiceCallback mConnectionServiceCallback;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public interface ConnectionServiceCallback {
        void hasInternetConnection();
        void hasNoInternetConnection();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        interval = intent.getIntExtra(TAG_INTERVAL, 10);
        url_ping = intent.getStringExtra(TAG_URL_PING);
        activity_name = intent.getStringExtra(TAG_ACTIVITY_NAME);

        try {
            mConnectionServiceCallback = (ConnectionServiceCallback) Class.forName(activity_name).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        mTimer = new Timer();
        mTimer.scheduleAtFixedRate(new CheckForConnection(), 0, interval * 1000);

        return super.onStartCommand(intent, flags, startId);
    }

    class CheckForConnection extends TimerTask{
        @Override
        public void run() {
            isNetworkAvailable();
        }
    }

    @Override
    public void onDestroy() {
        mTimer.cancel();
        super.onDestroy();
    }

    private boolean isNetworkAvailable(){
        HttpGet httpGet = new HttpGet(url_ping);
        HttpParams httpParameters = new BasicHttpParams();

        int timeoutConnection = 5000;
        HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);

        int timeoutSocket = 7000;
        HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

        DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
        try{
            httpClient.execute(httpGet);
            mConnectionServiceCallback.hasInternetConnection();
            return true;
        }
        catch(ClientProtocolException e){
            e.printStackTrace();
        }
        catch(IOException e){
            e.printStackTrace();
        }
        mConnectionServiceCallback.hasNoInternetConnection();
        return false;
    }

}

在您的 activity 中,您想要启动此服务的位置:

Intent intent = new Intent(this, ConnectionService.class);
    // Interval in seconds
    intent.putExtra(ConnectionService.TAG_INTERVAL, 100);
    // URL to ping
    intent.putExtra(ConnectionService.TAG_URL_PING, "http://www.google.com");
    // Name of the class that is calling this service
    intent.putExtra(ConnectionService.TAG_ACTIVITY_NAME, this.getClass().getName());
    // Starts the service
    startService(intent);

在您的 activity 上实施 ConnectionService.ConnectionServiceCallback 并覆盖方法:

@Override
public void hasInternetConnection() {
   // has internet
}

@Override
public void hasNoInternetConnection() {
   // no internet :(
}

停止服务

stopService(new Intent(this, ConnectionService.class));

`You can add these lines to your manifest and make a receiver

<receiver android:name=".NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>`

然后制作一个class如下

public class NetworkChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, final Intent intent) {

    if(checkInternet(context))
    {
        Toast.makeText(context, "Network Available Do operations",Toast.LENGTH_LONG).show(); 
    }

}

boolean checkInternet(Context context) {
    ServiceManager serviceManager = new ServiceManager(context);
    if (serviceManager.isNetworkAvailable()) {
        return true;
    } else {
        return false;
    }
}

}

public class ServiceManager {

Context context;

public ServiceManager(Context base) {
    context = base;
}

public boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isConnected();
}