【问题标题】:Tranfer Data from service to activity将数据从服务传输到活动
【发布时间】:2020-12-05 19:39:17
【问题描述】:

当用户杀死应用程序时,我的服务正在后台运行。 它有一个按钮,我可以返回到地图活动。但是,当用户在销毁应用程序后通过通知按钮返回应用程序时,地图已创建,但我从服务传输到地图活动的信息为空。

当用户没有杀死应用并通过通知按钮返回时,数据存在。

这是我的代码:

//Map Activity

        //OnPause = transfer the data to service intent(Working fine)

        BackgroundLocation backgroundLocation = new BackgroundLocation();
        mServiceIntent = new Intent(this, backgroundLocation.getClass());

        if (!isMyServiceRunning(backgroundLocation.getClass())) {

            mServiceIntent.putExtra("AddressBackgound",mAddress);
            mServiceIntent.putExtra("AddressLatBackgound",destinationLat);
            mServiceIntent.putExtra("AddressLngBackgound",destinationLng);

            startService(mServiceIntent);
        }


           // OnMapReady = Getting the data from service intent(return null for all data)

            if (myLocation != null) {

                BackgroundLocation backgroundLocation = new BackgroundLocation();
                mServiceIntent = new Intent(this, backgroundLocation.getClass());

                Bundle extras = getIntent().getExtras();

                if (isMyServiceRunning(backgroundLocation.getClass()) && extras != null) {

                    String mAddress2 = extras.getString("AddressBackgound22");
                    Double destinationLat2 = extras.getDouble("AddressLatBackgound22");
                    Double destinationLng2 = extras.getDouble("AddressLngBackgound22");

                    Log.e("onResume", "onResume stats");
                    Log.e("Address", "" + mAddress2);
                    Log.e("Lat", String.valueOf(destinationLat2));
                    Log.e("Lng", String.valueOf(destinationLng2));

                    Log.e("OnMapReady","Service is running....");

                }
                else{

                     Log.e("OnMapReady","Service is not running");

                }
          }

Background Location(Service Intent) = 从 MapsActivity 获取信息并将信息返回给 MapsActivity。

//Service Intent 

// OnStartCommand



        Bundle extras = intent.getExtras();

        if (extras != null) {

//getting the data to the service is working fine even when the app killed the service still working with the data.

            mAddress = extras.getString("AddressBackgound");
            destinationLat = extras.getDouble("AddressLatBackgound");
            destinationLng = extras.getDouble("AddressLngBackgound");


            //This is what I am trying to send to MapsActivity:

            extras.putString("AddressBackgound22",mAddress);
            extras.putDouble("AddressLatBackgound22",destinationLat);
            extras.putDouble("AddressLngBackgound22",destinationLng);


            Log.e("onStartCommand", "onStartCommand started");

            Log.e("Address","" + mAddress);
            Log.e("Lat",  "" + destinationLat);
            Log.e("Lng",  "" + destinationLng);


        }

感谢您的宝贵时间。

【问题讨论】:

    标签: java android android-studio service android-lifecycle


    【解决方案1】:

    有很多方法,我说一些:

    1-在服务中使用存储数据(例如SharedPrefrences,DB和...)并在活动中检索

    2-使用事件总线或广播接收器

    3-使用回调模式将数据从服务回调到活动

    【讨论】:

      【解决方案2】:

      多亏了@Mohammadreza,我在服务意图上使用了 sharedPref 并成功了。

      这就是我所做的:

             public static final String MY_PREFS_NAME = "MyData";
      

      //保存SharedPref(BackgroundActivity):

              SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
              editor.putString("AddressBackgound",mAddress);
              editor.putString("AddressLatBackgound", String.valueOf(destinationLat));
              editor.putString("AddressLngBackgound", String.valueOf(destinationLng));
              editor.apply();
      

      //读取 SharedPref(MapsActivity):

                  SharedPreferences prefs = getSharedPreferences(BackgroundLocation.MY_PREFS_NAME, MODE_PRIVATE);
      

      BackgroundLocation backgroundLocation = new BackgroundLocation();

                  if (isMyServiceRunning(backgroundLocation.getClass()) && prefs != null ) {
      
      
                       String mAddress = prefs.getString("AddressBackgound","mAddress");
                       Double UserStartLocationLat = Double.parseDouble(String.valueOf(Double.valueOf(prefs.getString("UserStartLocationLat", "UserStartLocationLatNull"))));
                       Double UserStartLocationLng = Double.parseDouble(String.valueOf(Double.valueOf(prefs.getString("UserStartLocationLng", "UserStartLocationLngNull"))));
      
                   }
      

      isMyServiceRunning:

      private boolean isMyServiceRunning(Class<?> serviceClass) {
          ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
          for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
              if (serviceClass.getName().equals(service.service.getClassName())) {
                  Log.i ("Service status", "Running");
                  return true;
              }
          }
          Log.i ("Service status", "Not running");
          return false;
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用事件总线或广播接收器将数据从服务发送到活动/片段

        【讨论】:

        • 欢迎来到 SO。通常会发送更多有用的信息,例如要使用的图书馆链接或文章。
        猜你喜欢
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多