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

只需將數據放入啓動第二個活動的Intent中即可。然後在第二個活動中,通過調用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

無需調用註冊接收器onResume.You也可以使用這種方式。

如果您需要使用Receiver onResume,則需要取消註冊onPause。

並請檢查您的位置changeded工作正常。

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

我不認爲你在這裏回答這個問題。你如何將這些信息發送給第二項活動。另外,你應該在'onPause()'中調用'unregisterReceiver()'。不應該使用onDestroy()來調用它或保存任何數據。閱讀此:https://developer.android.com/reference/android/app/Activity.html#onDestroy() –

+0

當然。我嘗試過上面的實現,但無論出於何種原因,它仍然不適合我。在'LocationService'類調用'onLocationChanged'函數 – user1871869

+0

@ th3pat3l之後''onReceive'永遠不會被調用,我已經在我關於onPause和onresume的回答中提到過了。他正在廣播位置onLocationChanged,這很好。但是無法獲得其他類的位置。所以,我只是舉例。 – Saveen

0

我不知道如果我理解正確的情況下,我可以將位置信息看不到整個結構。

首先,您只能在正確註冊接收器時收到廣播意圖。爲此你有兩種選擇:一種是靜態動態的方式。

您在onResume()方法中正確執行了此操作。只要應用程序正在運行,該應用程序就會調用/註冊接收器。

如果您想要一個更持久的解決方案,您應該在您的AndroidManifest.xml中以靜態方式註冊它。通過這樣做,Android系統知道您的應用程序包含位置數據的廣播接收器,並且可以傳達意圖。所以即使在您重新啓動設備後,接收器仍然在工作。唯一需要的是,您已經啓動了包含廣播接收器的應用至少一次。

這就是你必須在<application>元素內放入AndroidManifest.xml文件中的內容(當然,你必須相應地用你的字符串替換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