0

我有一個前景服務上傳圖像和廣播狀態使用intent與行動「myAction」。BroadcastReceiver在應用程序停止後不工作

我的應用程序需要對廣播做出反應,例如收到成功消息後發送服務器請求或收到失敗消息後彈出通知。我關注此https://developer.android.com/training/run-background-service/report-status.html

發送廣播意圖不啓動或恢復活動。 活動的BroadcastReceiver接收並處理目標,即使您的應用程序位於後臺但不強制 應用程序處於前臺。如果您想在應用程序不可見時通知用戶後臺發生的 事件,則 將使用通知。從不開始活動以響應傳入的廣播意圖 。

我首先嚐試在Manifest中靜態註冊我的廣播接收器。它不起作用。然後,我按照此指示Keep broadcast receiver running after application is closed開始註冊我的廣播接收器。當我滑出或關閉應用程序時,兩者都不起作用(沒有日誌顯示)。具體來說,我可以看到「HAHAHAHA」和「HEHEHEHE」日誌在前臺出現。一旦我從應用程序列表中刷出或點擊返回以退出應用程序,它就不會出現。

這是我的代碼。我在哪裏錯過?

在我的清單

<application...> 
    <receiver android:name=".MyBroadcastReceiver" 
     android:enabled="true" 
     android:exported="false"> 
    <intent-filter android:priority="0"> 
     <action android:name="myAction"/> 
    </intent-filter> 
    </receiver> 
    <service 
     android:name=".MyService" 
     android:exported="false"/> 
</application> 

MyBroadcastReceive.java

public class MyBroadcastReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    Log.d("HAHAHAHA", "Broadcast received."); 
    } 
} 

MyService.java

public class MyService extends Service { 
    BroadcastReceiver mReceiver; 

    // use this as an inner class like here or as a top-level class 
    public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // do something 
     Log.d("HEHEHEHE", "Broadcast received."); 
    } 
    } 

    @Override 
    public void onCreate() { 
    // get an instance of the receiver in your service 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("myAction"); 
    mReceiver = new MyReceiver(); 
    registerReceiver(mReceiver, filter); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
    return null; 
    } 


    @Override 
    public void onDestroy() { 
    Log.d("HEHEHEHE", "onDestroy"); 
    super.onDestroy(); 
    } 
} 

MainActivity.java

onStart() { 
    Intent intent = new Intent(this, MyService.class); 
    startService(intent); 
} 

廣播被稱爲象下面這樣:

LocalBroadcastManager.getInstance(service).sendBroadcast(intent); 

回答

1

我第一次嘗試在清單靜態註冊我的廣播接收器。它不起作用。

您不能在LocalBroadcastManager上使用清單註冊的接收器。只有通過LocalBroadcastManager.getInstance().registerReceiver()註冊的接收者纔會迴應本地廣播。

我的應用程序需要對廣播做出反應,例如收到成功消息後發送服務器請求或接收到失敗消息後彈出通知。

擺脫廣播,並在服務中做好這項工作。

+0

把它寫在服務中有點小,因爲我的服務是爲許多應用程序設計的。應用程序可能會對某些消息做不同的事情是否有可能使用全球廣播來解決這個問題? –

+0

@MingweiLin:如果你想在應用之間工作,全球廣播可以工作......至少在Android O今年晚些時候發貨之前。那時候,[事情會變得複雜](https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html)。並且您需要解決安全問題。但是,如果您從'LocalBroadcastManager.getInstance(service).sendBroadcast(intent)'切換到'service.sendBroadcast(intent);',那麼您的清單註冊的接收器將工作(再次,直到Android O發貨)。 – CommonsWare

相關問題