【问题标题】:How can I invoke a method of a service class from a broadcastReceiver ?如何从广播接收器调用服务类的方法?
【发布时间】:2017-03-24 09:02:18
【问题描述】:

我正在实现一个广播接收器来检查连接。我想从接收者的 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();

    }
} 

【问题讨论】:

  • See this 这可能会解决您的问题。

标签: android service android-broadcastreceiver


【解决方案1】:

如果您愿意启动不需要执行 UI 操作的长时间操作,您可以使用IntentService 而不是Service,因为Service 确实在MainThread 上运行 em>。

比如说你的服务就像 -

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()就会被调用,如果你愿意做任何操作,这就是你要做的地方

【讨论】:

    【解决方案2】:

    找到解决办法

    1. 创建广播接收器

                          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.创建接口

                      public interface NetworkInfoListener {
                          void onNetWorkStatusChange(boolean isConnected);
                      }
      
      1. 在您的活动 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();
                        }
                    }
        
      2. 当您在活动中实现 NetworkInfoListener 时,以下覆盖方法将在网络更改时调用

                  @Override
                public void onNetWorkStatusChange(boolean isConnected) {
                    LegionUtils.doUpdateNetworkStatus(ShiftDropSucessActivity.this,        offlineTv, isConnected);
                }
        
    2. 在您的活动中取消注册 BroadcastReciver

        public static void doUnRegisterConnectivityReceiver(Context context, NetworkInfoReceiver networkInfoReciver) {
              try {
                  if (networkInfoReciver != null && context != null) {
                      context.unregisterReceiver(networkInfoReciver);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      

    【讨论】:

      【解决方案3】:

      我按照以下步骤解决了这个问题:

      1. 我识别服务的任务(消费api,存储数据 ...) 完成后我停止服务。
      2. 当接收器通知我 Wifi 已禁用时,我停止 当前服务以及当它通知我 Wifi 已启用时, 我再次启动服务以重做所有任务。

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多