인터넷 연결 상태 변경에 대한 Android 이벤트
이 질문에 이미 답변이 있습니다.
- INTENT 인터넷 연결 확인 12 답변
사용자가 내 서버에 정보와 파일을 자주 올리는 앱을 만들고 있습니다. 이는 전용 업 로더 서비스를 통해 새 스레드에서 수행됩니다.
이 스레드에서 알아
Android에서 사용 가능한 인터넷 연결이 있는지 감지
비교적 쉽게 인터넷에 연결되어 있는지 확인할 수 있습니다. socketTimeoutExceptions를 가져 와서 인터넷 연결 문제를 감지 할 수도 있습니다. 모든 것이 훌륭하고 훌륭하며 어떤 이유로 든 연결이 작동하지 않을 때 업로드를 쉽게 캐시 할 수 있습니다.
내 질문은 업로드를 다시 시도해야 할 때를 어떻게 알 수 있습니까? 연결이 복원 될 때 트리거되는 이벤트가 있습니까? 아니면 잠자는 새 스레드를 만들고 30 초마다 인터넷 연결을 확인합니까?
어떤 아이디어라도 감사하겠습니다!
매우 오래된 게시물이지만 수신기를 공유하고 싶습니다.
매니페스트 또는 기타 지루한 리소스에 손을 댈 필요가 없습니다. :)
용법
당신의 활동 :
/*
* You need to implement NetworkStateReceiverListener.
* This interface is described inside the NewtworkStateReceiver class
*/
public class MyActivity implements NetworkStateReceiverListener {
/* ... */
private NetworkStateReceiver networkStateReceiver;
}
활동 중 : 수신기 즉시 설치
public void onCreate(Bundle savedInstanceState) {
/* ... */
networkStateReceiver = new NetworkStateReceiver();
networkStateReceiver.addListener(this);
this.registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
}
public void onDestroy() {
super.onDestroy();
networkStateReceiver.removeListener(this);
this.unregisterReceiver(networkStateReceiver);
}
활동 : 필요한 방법 구현
@Override
public void networkAvailable() {
Log.d("tommydevall", "I'm in, baby!");
/* TODO: Your connection-oriented stuff here */
}
@Override
public void networkUnavailable() {
Log.d("tommydevall", "I'm dancing with myself");
/* TODO: Your disconnection-oriented stuff here */
}
수신자
NetworkStateReceiver.java로 프로젝트에 복사하여 붙여 넣으십시오.
public class NetworkStateReceiver extends BroadcastReceiver {
protected Set<NetworkStateReceiverListener> listeners;
protected Boolean connected;
public NetworkStateReceiver() {
listeners = new HashSet<NetworkStateReceiverListener>();
connected = null;
}
public void onReceive(Context context, Intent intent) {
if(intent == null || intent.getExtras() == null)
return;
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = manager.getActiveNetworkInfo();
if(ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
connected = true;
} else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
connected = false;
}
notifyStateToAll();
}
private void notifyStateToAll() {
for(NetworkStateReceiverListener listener : listeners)
notifyState(listener);
}
private void notifyState(NetworkStateReceiverListener listener) {
if(connected == null || listener == null)
return;
if(connected == true)
listener.networkAvailable();
else
listener.networkUnavailable();
}
public void addListener(NetworkStateReceiverListener l) {
listeners.add(l);
notifyState(l);
}
public void removeListener(NetworkStateReceiverListener l) {
listeners.remove(l);
}
public interface NetworkStateReceiverListener {
public void networkAvailable();
public void networkUnavailable();
}
}
즐겨 ;)
연결이 변경 될 때 간단한 작업을 수행하려는 경우 훨씬 더 쉬운 솔루션이 있습니다.
활동에서 브로드 캐스트 수신기를 만듭니다.
private BroadcastReceiver networkStateReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = manager.getActiveNetworkInfo();
doSomethingOnNetworkChange(ni);
}
};
그런 다음에 onResume
하고 onPause
등록을 수행합니다
@Override
public void onResume() {
super.onResume();
registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
public void onPause() {
unregisterReceiver(networkStateReceiver);
super.onPause();
}
Not quite sure what was going on in Tommaso's broadcast receiver but it wasn't working for me, here's my implementation. It only notifies on change between connectivity available/unavailable.
Also I register it in onResume()
and unregister in onPause()
. Otherwise it's the same as above.
public class NetworkStateReceiver extends BroadcastReceiver {
private ConnectivityManager mManager;
private List<NetworkStateReceiverListener> mListeners;
private boolean mConnected;
public NetworkStateReceiver(Context context) {
mListeners = new ArrayList<NetworkStateReceiverListener>();
mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
checkStateChanged();
}
public void onReceive(Context context, Intent intent) {
if (intent == null || intent.getExtras() == null)
return;
if (checkStateChanged()) notifyStateToAll();
}
private boolean checkStateChanged() {
boolean prev = mConnected;
NetworkInfo activeNetwork = mManager.getActiveNetworkInfo();
mConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
return prev != mConnected;
}
private void notifyStateToAll() {
for (NetworkStateReceiverListener listener : mListeners) {
notifyState(listener);
}
}
private void notifyState(NetworkStateReceiverListener listener) {
if (listener != null) {
if (mConnected) listener.onNetworkAvailable();
else listener.onNetworkUnavailable();
}
}
public void addListener(NetworkStateReceiverListener l) {
mListeners.add(l);
notifyState(l);
}
public void removeListener(NetworkStateReceiverListener l) {
mListeners.remove(l);
}
public interface NetworkStateReceiverListener {
public void onNetworkAvailable();
public void onNetworkUnavailable();
}
}
Android Nougat & O (API 24+) - Network State
Changes mades to @darnmason answer (constructor) to make it work on API 24+.
public NetworkStateReceiver(Context context) {
mListeners = new ArrayList<>();
mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(NetworkStateReceiver.this, intentFilter);
checkStateChanged();
}
ReferenceURL : https://stackoverflow.com/questions/6169059/android-event-for-internet-connectivity-state-change
'UFO ET IT' 카테고리의 다른 글
Scala에서 더 나은 문자열 포맷팅 (0) | 2021.01.05 |
---|---|
관계형 대수로 MAX를 어떻게 찾을 수 있습니까? (0) | 2021.01.05 |
Linux에서 C의 디렉토리를 재귀 적으로 나열하는 방법은 무엇입니까? (0) | 2021.01.05 |
배열 변경시 $ watch가 트리거되지 않음 (0) | 2021.01.05 |
Github SSH 구성 (0) | 2021.01.05 |