簡體   English   中英

Xamarin Android中未調用廣播接收器OnReceive

[英]Broadcast receiver OnReceive not being called in Xamarin Android

我通常不會在這樣的論壇上發布問題,但是今天,我的沮喪情緒卻突如其來。

我正在嘗試實現一個解決方案,該解決方案使我每小時/每天都可以更新應用程序中的匯率列表(沒關系)。 我在很多論壇上都在尋找問題的答案,但是即使其他人也遇到了onReceive未被調用的相同問題,但沒有任何答案可以幫助我。

我當前正在嘗試運行由AlarmManager的SetRepeating方法觸發的廣播接收器。 我的主要活動+接收者+清單代碼如下所示:

主要方法(只是啟動警報的一段代碼):

    var lvarManager = (AlarmManager)GetSystemService (Context.AlarmService);

    Intent lvarCurrencyIntent = new Intent (this, typeof(CurrencyUpdateService));

    var lvarPendingIntent = PendingIntent.GetBroadcast (this, 0, lvarCurrencyIntent, PendingIntentFlags.CancelCurrent);
    lvarManager.SetRepeating (AlarmType.Rtc, 1000, 5000, lvarPendingIntent);

接收方:

    public class CurrencyUpdateService : BroadcastReceiver
{       
    public override void OnReceive (Context context, Intent intent)
    {
        Toast.MakeText (context, "Running", ToastLength.Short).Show ();
    }
}

表現:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="SplitTheBill.SplitTheBill" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="16" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application android:label="SplitTheBill" android:icon="@drawable/groups"></application>
<receiver android:process=":remote" android:name=".CurrencyUpdateService"/>
<provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="2147483647" android:authorities="StockService.StockService.mono.MonoRuntimeProvider.__mono_init__" />

我想說明一下,我是Xamarin的新用戶,並且可以確保您不觸摸清單文件,因此我成功地添加了以下代碼:

<receiver android:process=":remote" android:name=".CurrencyUpdateService"/>

我嘗試在一個全新的解決方案中運行代碼,但沒有用。 我嘗試使用不同類型的警報類型和服務,但沒有運氣。

隨意提出自己的解決方案,並嘲笑我提出明顯問題的臉;)

1)使用BroadcastReceiver屬性標記廣播接收器類,以便在編譯時在AndroidManifest.xml中生成適當的標記:

[BroadcastReceiver]
public class CurrencyUpdateService : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        Toast.MakeText(context, "Running", ToastLength.Short).Show();
    }
}

現在,您的接收器將每5秒鍾開始烘烤一次。

注意 :Xamarin會自動生成Android類名標識符,因此,如果您不對類名進行硬編碼,則無法手動編輯清單以添加此項。

上面代碼中的AndroidManifest.xml會為我生成:

<receiver android:name="md57db81284125fca721c48509d8e9cea0b.CurrencyUpdateService" />

現在,如果您手動將Name添加到Attribute ,則可以控制生成的內容。 如果其他Android應用程序需要呼叫您並且需要使用預定義的(靜態)名稱來調用它,則需要這樣做。

[BroadcastReceiver(Name = "com.sushihangover.alarmso.Foobar")]
public class CurrencyUpdateService : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        Toast.MakeText(context, "Running", ToastLength.Short).Show();
    }
}

注意請勿使用Android樣式的“點名” ,而應使用包含您的軟件包名稱的標准名稱,有關詳細信息,請參見鏈接

AndroidManifest.xml現在包含:

<receiver android:name="com.sushihangover.alarmso.Foobar" />

2)至於為什么要嘗試啟動新進程,請記住, BroadcastReceiver不是Android Service ...您可以刪除清單中的:process標記,因為您在執行操作時不需要它。

如果您確實希望創建並啟動本地或后台服務,則應結帳:

謝謝你的回答。

我終於通過在CurrencyUpdateService類中添加了一個意圖過濾器屬性來使其工作,但是我意識到我真正需要的是即使關閉了應用程序也要運行的粘性服務。

我完成了一項每天在指定時間運行的服務(由於服務處於粘滯狀態,在該應用程序關閉后也有5秒運行)+ BroadcastReceiver,用於系統重新啟動以重新安排服務的時間+幾個其他廣播接收器,以使應用程序更智能。

唯一要記住的是,在短間隔(<10分鍾)內進行測試時,請不要相信AlarmManager,因為有時它會觸發警報,導致時間不夠用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM