如何从 broadcastReceiver 调用服务 class 的方法?
How can I invoke a method of a service class from a broadcastReceiver ?
我正在实现一个广播接收器来检查连接。我想从接收器的 onReceive 方法调用 service 的方法。
如何从接收方调用服务的方法?
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if ((intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)
|| (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)))) {
boolean status = NetworkUtil.isOnline(context);
if (status) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
// Here I want to invoke a method in the service to consume api and check new results ;
updateAllWidgets(context, appWidgetManager, appWidgetIds);
}
Toast.makeText(context, "Network change " + msg, Toast.LENGTH_SHORT).show();
}
}
如果您愿意开始不需要执行UI操作的长时间操作,您可以使用IntentService
代替Service
,正如 Service
在 MainThread
上做 运行。
比如说你的服务就像 -
public class MyActionService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
// Data will be available in intent
// Normally we would do some work here, like download a file.
}
}
您可以使用
启动服务
startService(new Intent(context, MyActionService.class));
一旦你开始服务,你的onHandleIntent()
就会被调用,如果你愿意做任何操作,这里就是你做的地方
找到解决方案
创建广播接收器
public class NetworkInfoReceiver extends BroadcastReceiver {
NetworkInfoListener infoListener;
@Override
public void onReceive(Context context, Intent intent) {
if (null != intent) {
try {
infoListener = (NetworkInfoListener) context;
if (infoListener != null) {
infoListener.onNetWorkStatusChange(LegionUtils.isOnline(context));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.Create 界面
public interface NetworkInfoListener {
void onNetWorkStatusChange(boolean isConnected);
}
在您的 activity onResume()
中注册接收者
public static void doRegisterConnectivityReceiver(NetworkInfoReceiver receiver, Context context) {
try {
if (receiver != null && context != null) {
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(receiver, filter);
}
} catch (Exception e) {
e.printStackTrace();
}
}
当您在 activity 中实现 NetworkInfoListener 时,下面的覆盖方法将在网络更改时调用
@Override
public void onNetWorkStatusChange(boolean isConnected) {
LegionUtils.doUpdateNetworkStatus(ShiftDropSucessActivity.this, offlineTv, isConnected);
}
在您的 activity
中注销 BroadcastReciver
public static void doUnRegisterConnectivityReceiver(Context context, NetworkInfoReceiver networkInfoReciver) {
try {
if (networkInfoReciver != null && context != null) {
context.unregisterReceiver(networkInfoReciver);
}
} catch (Exception e) {
e.printStackTrace();
}
}
我按照以下步骤解决了这个问题:
- 我识别服务的任务(消费api,存储数据
...) 完成后我停止服务。
- 当接收器通知我 Wifi 被禁用时,我停止
当前服务以及当它通知我 Wifi 已启用时,
我再次启动服务以重做所有任务。
我正在实现一个广播接收器来检查连接。我想从接收器的 onReceive 方法调用 service 的方法。
如何从接收方调用服务的方法?
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if ((intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)
|| (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)))) {
boolean status = NetworkUtil.isOnline(context);
if (status) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
// Here I want to invoke a method in the service to consume api and check new results ;
updateAllWidgets(context, appWidgetManager, appWidgetIds);
}
Toast.makeText(context, "Network change " + msg, Toast.LENGTH_SHORT).show();
}
}
如果您愿意开始不需要执行UI操作的长时间操作,您可以使用IntentService
代替Service
,正如 Service
在 MainThread
上做 运行。
比如说你的服务就像 -
public class MyActionService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
// Data will be available in intent
// Normally we would do some work here, like download a file.
}
}
您可以使用
启动服务startService(new Intent(context, MyActionService.class));
一旦你开始服务,你的onHandleIntent()
就会被调用,如果你愿意做任何操作,这里就是你做的地方
找到解决方案
创建广播接收器
public class NetworkInfoReceiver extends BroadcastReceiver { NetworkInfoListener infoListener; @Override public void onReceive(Context context, Intent intent) { if (null != intent) { try { infoListener = (NetworkInfoListener) context; if (infoListener != null) { infoListener.onNetWorkStatusChange(LegionUtils.isOnline(context)); } } catch (Exception e) { e.printStackTrace(); } } } }
2.Create 界面
public interface NetworkInfoListener { void onNetWorkStatusChange(boolean isConnected); }
在您的 activity onResume()
中注册接收者public static void doRegisterConnectivityReceiver(NetworkInfoReceiver receiver, Context context) { try { if (receiver != null && context != null) { IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); context.registerReceiver(receiver, filter); } } catch (Exception e) { e.printStackTrace(); } }
当您在 activity 中实现 NetworkInfoListener 时,下面的覆盖方法将在网络更改时调用
@Override public void onNetWorkStatusChange(boolean isConnected) { LegionUtils.doUpdateNetworkStatus(ShiftDropSucessActivity.this, offlineTv, isConnected); }
在您的 activity
中注销 BroadcastReciverpublic static void doUnRegisterConnectivityReceiver(Context context, NetworkInfoReceiver networkInfoReciver) { try { if (networkInfoReciver != null && context != null) { context.unregisterReceiver(networkInfoReciver); } } catch (Exception e) { e.printStackTrace(); } }
我按照以下步骤解决了这个问题:
- 我识别服务的任务(消费api,存储数据 ...) 完成后我停止服务。
- 当接收器通知我 Wifi 被禁用时,我停止 当前服务以及当它通知我 Wifi 已启用时, 我再次启动服务以重做所有任务。