代码之家  ›  专栏  ›  技术社区  ›  umitkilic

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

  •  0
  • umitkilic  · 技术社区  · 6 年前

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

    我计划创建一个android应用程序,在用户连接互联网后立即将其中一些插入的信息发送给用户。实际上,我想要实现的是发送通知,比如脸书、推特或Instagram(你知道,当你打开连接时,评论、转发、喜欢、提及等。通知会在一分钟内发送)。我认为这可以通过在AlarmManager中每隔2到5分钟检查一次用户的连接来实现,但这看起来对电池不太好。应该有一些更专业或更合理的解决方案。你能告诉我一个实现这个的方法吗?

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

    3 回复  |  直到 6 年前
        1
  •  1
  •   Ashish srivastava    6 年前

    `您可以将这些行添加到您的清单中,并创建接收者

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

    然后按如下方式上课

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

    }

    公共类服务管理器{

    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();
    }
    
        2
  •  0
  •   Ashish srivastava    6 年前

    您可以通过添加这行代码来检查internet连接,为了更好地理解,您应该创建所有活动的父类,并将此代码放在那里,并在所有子活动中扩展基本活动(父),每次创建任何活动时都会执行。

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

        3
  •  0
  •   Pankaj Mundra    6 年前

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

    供参考: 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;
        }
    
    }
    

    在您的活动中,您要在哪里启动此服务:

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

    实现连接服务。ConnectionService回调活动并重写方法:

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

    停止服务

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