检查用户的互联网连接以在其打开时发送通知的最佳方式是什么?
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();
}
我是发送通知的新手。我了解 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();
}