1

Я хочу иметь Broadcast Receiver для получения информации о местоположении для еще не начатого действия. В основном у меня есть место, которое я получаю в одном действии. Когда я нажимаю кнопку FAB, я хочу взять местоположение, которое я получил в первом действии, и передать его в действие, которое выполняет кнопка FAB, чтобы я мог использовать местоположение в этом действии. Вот моя попытка:Получать трансляцию за активность еще не началась?

LocationServices.java: Здесь я получаю и передаю location.

@Override 
    public void onLocationChanged(Location location) { 
     if (location.hasAccuracy()) { 
      if (location.getAccuracy() < 30) { 
       locationUpdateListener.updateLocation(location); 
       Intent broadcastIntent = new Intent(LocationService.ACTION_LOCATION); 
       broadcastIntent.putExtra("latitude", location.getLatitude()); 
       broadcastIntent.putExtra("longitude", location.getLongitude()); 
       activity.sendBroadcast(broadcastIntent); 
      } 
     } 
    } 

CreatePost.java: Вот где я хочу, чтобы в идеале захватить место, которое транслировалось и использовать его в этом файле, но onReceive никогда не вызывается. Действие создается, когда пользователь нажимает кнопку FAB.

@Override 
public void onResume() { 
    super.onResume(); 
    locationReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      try { 
       if(location == null) { 
        location = new Location("Provider"); 
       } 
       location.setLatitude(intent.getDoubleExtra("latitude", 0.0)); 
       location.setLongitude(intent.getDoubleExtra("longitude", 0.0)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    }; 
    registerReceiver(locationReceiver, new IntentFilter(LocationService.ACTION_LOCATION)); 
} 

Есть ли способ, чтобы отправить location над когда активность инстанциируется? Или я неправильно понимаю идею Broadcast Receiver?

+0

Как начать вторую операцию? Можем ли мы увидеть код? Вместо того, чтобы отправлять широковещательную рассылку, вы можете отправить широту и долготу, когда вы начнете ее сначала. –

+0

Вы можете поместить данные в намерение, которое начнет второе действие. – wrkwrk

ответ

2

Просто поместите данные в намерение, которое начнет второе действие. Затем во втором действии получите намерение, вызвав getIntent() и извлеките из него данные. Что-то вроде этого:

Проходит расположение деталей на

private void startActivityWithData() { 
    Intent intent = new Intent(this, SecondActivity.class); 
    intent.putExtra("latitude", location.getLatitude()); 
    intent.putExtra("longitude", location.getLongitude()); 
    startActivity(intent); 
} 

и получить детали Места на SecondActivity по

class SecondActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent intent = getIntent(); 
     float latitude = intent.getFloatExtra("latitude", 0); 
     float longitude = intent.getFloatExtra("longitude", 0); 
    } 
} 
0

не нужно звонить ресиверу на реселлере. Вы также можете использовать этот способ.

Если вам необходимо использовать Receiver onResume, вам необходимо отменить регистрацию onPause.

И, пожалуйста, проверьте правильность работы вашего сайта.

public class YourActivity extends AppCompatActivity { 

private Location newLocation; 

private BroadcastReceiver coordinateReceiver = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
    try { 
     newLocation.setLatitude(intent.getDoubleExtra("latitude", 0.0)); 
     newLocation.setLongitude(intent.getDoubleExtra("longitude", 0.0)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_activity); 
    registerReceiver(coordinateReceiver, new IntentFilter(LocationService.ACTION_LOCATION)); 

} 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    try { 
     unregisterReceiver(coordinateReceiver); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

} 
+0

Я не думаю, что вы отвечаете на этот вопрос. Как вы отправляете эту информацию второму действию. Кроме того, вы должны вызывать 'unregisterReceiver()' в 'onPause()'. 'onDestroy()' не следует использовать для вызова этого или для сохранения любых данных. Прочтите это: https://developer.android.com/reference/android/app/Activity.html#onDestroy() –

+0

Конечно. Я попробовал вашу реализацию выше, но по какой-то причине он все еще не работает для меня. 'onReceive' никогда не вызывается после того, как класс' LocationService' вызывает функцию onLocationChanged. – user1871869

+0

@ th3pat3l. Я уже упоминаю в своем ответе о onPause и onresume.He транслирует местоположение onLocationChanged, что отлично. Но не удается получить местоположение в другом классе. Итак, я просто приведу пример. – Saveen

0

Я не уверен, если я правильно понял ваш сценарий правильно, как я могу Я вижу всю структуру.

Прежде всего, вы можете получать трансляцию только в том случае, если вы правильно зарегистрировали приемник. Для этого у вас есть два варианта: a статические и динамический путь.

Вы сделали это правильно в своем методе onResume(). Это должно работать до тех пор, пока выполняется приложение, которое вызвало/зарегистрировало приемник.

Если вы хотите получить более постоянное решение, вы должны зарегистрировать его статическим способом в своем AndroidManifest.xml. Таким образом, система Android знает, что ваше приложение содержит широковещательный приемник для данных о местоположении и может доставить намерение. Поэтому даже после перезагрузки устройства приемник все еще работает. Единственное, что вам нужно, это вы уже запустили приложение, содержащее широковещательный приемник, по крайней мере, один раз.

Это то, что вы должны положить в свой AndroidManifest.xml внутри элемента <application> (конечно, вы должны заменить com.your.example.ACTION_LOCATION на свою строку соответственно).

<receiver android:name=".LocationBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="com.your.example.ACTION_LOCATION" /> 
    </intent-filter> 
</receiver> 

Поскольку вы явно указать в манифесте, вы должны создать соответствующий класс тоже:

public class LocationBroadcastReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
       // your code when intent is received 
     } 
} 

Если вы делаете это таким образом, вам больше не придется зарегистрировать приемник в вашем коде и вам также не нужно создавать экземпляр вручную.

Для получения более подробной информации об этом см. here.

 Смежные вопросы

  • Нет связанных вопросов^_^