将服务结果发送到活动

时间:2017-05-23 15:12:30

标签: android android-intent android-activity

我有BroadcastReceiver检查互联网连接是否可用,然后启动从DB中检索ArrayList的服务:

public class NetworkWatcher extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        Intent retrieveVehicleList = new Intent(context, RetrieveVehicleListService.class);

        if (info != null)
        {
            if (info.isConnected())
            {
                context.startService(retrieveVehicleList);
            }
            else
            {
                context.stopService(retrieveVehicleList);
            }
        }
    }
}

public class RetrieveVehicleListService extends IntentService
{
    private static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    private NotificationCompat.Builder builder;
    private ArrayList<Vehicle> vehicles;

    private void parseVehiclesFromMap(ArrayList vehicles)
    {
        for (int i = 0; i < vehicles.size(); i++)
        {
            final Vehicle v = new Vehicle();
            HashMap vehicleMap = (HashMap) vehicles.get(i);

            v.setPlate(vehicleMap.get("plate").toString());
            v.setKm(vehicleMap.get("km") == null ? null : Integer.parseInt(vehicleMap.get("km").toString()));
            v.setFuelQuantity(Double.parseDouble(vehicleMap.get("fuel_quantity").toString()));
            v.setEffectiveFuelEconomy(Double.parseDouble(vehicleMap.get("fuel_economy").toString()));
            v.setInsuranceDate(vehicleMap.get("insurance_date") == null ? null : new LocalDate(vehicleMap.get("insurance_date").toString()));
            v.setMatriculationDate(new LocalDate(vehicleMap.get("matriculation_date").toString()));
            v.setLatitude(vehicleMap.get("latitude") == null ? null : Double.parseDouble(vehicleMap.get("latitude").toString()));
            v.setLongitude(vehicleMap.get("longitude") == null ? null : Double.parseDouble(vehicleMap.get("longitude").toString()));
            v.setFuelType(FuelType.fromInt(Integer.parseInt(vehicleMap.get("id_fuel").toString())));

            this.vehicles.add(v);
        }
    }

    private void sendRequest(int userID)
    {
        Response.Listener<String> listener = new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response)
            {
                try
                {
                    HashMap json = new ObjectMapper().readValue(response, HashMap.class);
                    String errorCode = json.get("error_code").toString();

                    switch (errorCode)
                    {
                        case "0":
                            parseVehiclesFromMap((ArrayList) json.get("vehicles"));
                            break;
                        default:
                            // TODO gestire
                            break;
                    }
                }
                catch (IOException e)
                {
                    // TODO gestire
                    e.printStackTrace();
                }
            }
        };

        VehicleListRequest request = new VehicleListRequest(String.valueOf(userID), listener, null);
        RequestQueue queue = Volley.newRequestQueue(this);
        queue.add(request);
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {
        SharedPreferences sp = getSharedPreferences(getString(clyky.cartracker.R.string.sharedPreferencesName), Context.MODE_PRIVATE);
        int userID = sp.getInt("id_user", SplashActivity.DEFAULT_USER_ID);

        if (userID != SplashActivity.DEFAULT_USER_ID)
        {
            sendRequest(userID);
        }
    }

    public RetrieveVehicleListService()
    {
        super("RetrieveVehicleList");
        vehicles = new ArrayList<>();
    }
}

我希望我的MainActivity在活动开始时从ArrayList获取RetrieveVehicleListService。我怎么能这样做?

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用LocalBroadcast接收器将数据从服务发送到活动。将以下代码添加到您的活动

private BroadcastReceiver  BReceiver = new BroadcastReceiver(){

@Override
public void onReceive(Context context, Intent intent) {
    //put here whaterver you want your activity to do with the intent received
ArrayList<String> arrayList=intent.getStringArrayListExtra("arrayList");

}           
};

protected void onResume(){
super.onResume();
LocalBroadcastManager.getInstance(this).registerReceiver(bReceiver, new IntentFilter("message"));
}

protected void onPause (){
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver);
}

并使用以下方法从服务发送广播

private void sendBroadcast (boolean success){
Intent intent = new Intent ("message"); //put the same message as in the filter you used in the activity when registering the receiver
intent.putExtra("success", success);
intent.putStringArrayListExtra("arrayList", arrayList);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

答案 1 :(得分:0)

使用本地广播接收器:

使用以下代码发送广播

Intent intent = new Intent("YourAction");
Bundle bundle = new Bundle();
bundle .putSerializable("ARRAYLIST",(Serializable)vehicles);
intent.putExtra("BUNDLE",bundle);
intent.putExtras(intent)
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

在您的活动中接收广播:

private MyBroadcastReceiver myReceiver;

@Override
public void onResume(){
    myReceiver = new MyReceiver();
    final IntentFilter intentFilter = new IntentFilter("YourAction");
    LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, intentFilter);
}

@Override
public void onPause(){
    if(myReceiver != null)
        LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver);
    myReceiver = null;
}

public class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
             // Here you have the received broadcast 
             // And if you added extras to the intent get them here too
             // this needs some null checks
         Intent intent = getIntent();
       Bundle args = intent.getBundleExtra("BUNDLE");
       ArrayList<Object> object = (ArrayList<Object>)args.getSerializable("ARRAYLIST");

        }
}
相关问题