簡體   English   中英

在 Android 7.1 上運行后台服務

[英]Running background service on Android 7.1

我在開發方面經驗豐富,但對 Android 開發不熟悉。 對於 Android 7.1,您將設置后台服務的策略是什么(目的是它可以每 N 秒 ping 一個服務器)。 這是針對公司項目而不是公共消費,因為這聽起來像是公共使用的不良要求。

希望 Android 有一種方法可以在屏幕鎖定和設備啟動時工作。

到目前為止,我發現的是在舊版本的 Android 操作系統上,您可以在單獨的進程中啟動后台服務,由廣播接收器在 Boot Completed 事件中啟動。 但是在更新的 Android 版本中,操作系統似乎限制了此廣播事件。 我在 Xamarin 上運行了這種類型的代碼,但似乎無法在 Android 7.1 上運行(從未收到廣播啟動完成事件)。

一份 Android 文檔建議使用 Job Scheduler,但這似乎只在應用程序運行時有效,而且似乎在操作系統進入瞌睡時停止執行。 例如,自 2011/2014 年發布以來,Android 操作系統似乎已經發展了很多,這是一個非常奇怪的要求,所以在這里發布。

示例代碼(Xamarin C#):(適用於 Android 7.1)

廣播接收器

public class MyBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        //Toast.MakeText(context, "Broadcaster receiver", ToastLength.Long).Show(); //no breakpoint hit or toast appears
        Intent startServiceIntent = new Intent(context, typeof(DemoService));
        context.StartService(startServiceIntent);
    }
}

AndroidManifest.xml

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
    <receiver android:name="MyNamespace.MyBroadcastReceiver" android:enabled="true" android:exported="true" android:label="BootReceiver">
        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" android:directBootAware="true" />
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

您需要從電源管理中將每個設備上的應用程序列入白名單。 然后做一個前台服務,啟動一個線程,每隔幾秒執行一次操作。 這種組合應該可以讓您度過瞌睡和服務限制。

BOOT_COMPLETED 仍應按預期工作。 廣播被限制在 7 和 8,但這個明確不是。

JobScheduler 不適合需要每隔幾秒運行一次的東西。 每隔幾分鍾,是的。 不是秒。

請注意,這些設備的電池壽命會很糟糕。 他們會得到一整天的時間令人懷疑。

暫無
暫無

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

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