2016-08-03 56 views
1

我有我的主要活動,啓動一項服務(位置服務),我希望該服務廣播新位置找到每個新的位置。Android - 無法接收本地廣播從我的活動從服務

感謝日誌我知道服務正在工作,我每隔幾秒鐘都有新的位置,但我從來沒有收到廣播。

MainActivity.java

public class MainActivity extends Activity { 


private static final String TAG = "mainActivity"; 

private CMBroadcastReceiver mMessageReceiver = new CMBroadcastReceiver(); 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    // Start Service 
    startService(new Intent(this, LocationService.class)); 

    super.onCreate(savedInstanceState); 
} 

@Override 
public void onResume() 
{ 
    LocalBroadcastManager.getInstance(this).registerReceiver(
      mMessageReceiver, new IntentFilter(CMBroadcastReceiver.RECEIVE_LOCATION_UPDATE)); 
    super.onResume(); 
} 

@Override 
public void onPause() 
{ 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    super.onPause(); 
} 
} 

CMBroadcastReceiver.java

public class CMBroadcastReceiver extends BroadcastReceiver { 

private static final String TAG = "CMBroadcastReceiver"; 

public static final String RECEIVE_LOCATION_UPDATE = "LOCATION_UPDATES"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "Received broadcast"); 
    String action = intent.getAction(); 
    if (action.equals(RECEIVE_LOCATION_UPDATE)) 
    { 
     Log.i(TAG, "Received location update from service!"); 
    } 
} 
} 

LocationService.java

/** 
* Callback that fires when the location changes. 
*/ 
@Override 
public void onLocationChanged(Location location) { 
    mCurrentLocation = location; 
    mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
    Log.i(TAG, "onLocationChanged " + location); 

    Intent intent = new Intent(CMBroadcastReceiver.RECEIVE_LOCATION_UPDATE); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
    Log.i(TAG, "Broadcast sent"); 
} 

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.cyclemapapp.gpstracker"> 

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" 
     android:theme="@style/AppTheme.NoActionBar"> 
     android:configChanges="orientation|screenSize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name=".LocationService" android:process=":location_service" /> 
</application> 

我,我可以看到,「廣播發送」但我從來沒有得到日誌「廣播接收」

任何幫助將將不勝感激。

編輯:

編輯的意圖是如何在位置服務創建爲Shaishav建議。

仍然不起作用。

+0

你的意圖不應該引用MainActivity.class。這是爲了啓動服務或活動,而不是廣播。 –

+1

'LocalBroadcastManager'不能跨進程工作。你的'服務'運行在一個單獨的過程中。 –

+1

@MikeM。您可以發表您的評論作爲答案。我從清單中刪除了過程標籤,並收到了廣播thx! –

回答

3

LocalBroadcastManager跨進程不起作用。您的Service正在運行一個單獨的過程。

您可以運行Service在同一個進程中Activity - 從<service>元素去掉process屬性 - 或者使用某種IPC代替 - 例如,通過發送和接收上一個Context的廣播,而不是LocalBroadcastManager

1

在你LocationService,利用發送本地廣播:

Intent intent = new Intent(CMBroadcastReceiver.RECEIVE_LOCATION_UPDATE); 
LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
+0

試過了,仍然不起作用。更新了問題中的代碼。 –

+0

@SébastienLemieux請勿在'Receiver'中檢查ACTION,因爲我們沒有將其設置爲我們的意圖。 – Shaishav

0
<service android:name=".LocationService" android:process=":location_service" /> 

你的服務是從活動的獨立進程。 LocalBroadcastManager僅適用於一個過程。從<service>中刪除android:process,或使用某種IPC機制(例如,系統廣播,正確保護)。