国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android啟動(dòng)前臺(tái)服務(wù)(startForegroundService)

這篇具有很好參考價(jià)值的文章主要介紹了Android啟動(dòng)前臺(tái)服務(wù)(startForegroundService)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

問(wèn)題:

APP in background in null uid
AndroidRuntime: android.app.RemoteServiceException: Context.startForegroundService()
 did not then call Service.startForeground():

注意事項(xiàng):

  • 8.0適配:通知需要加上NotificationChannel,開(kāi)啟前臺(tái)服務(wù)的方式startForegroundService()
  • 9.0適配:manifest.xml文件中需要增加權(quán)限:FOREGROUND_SERVICE

Android之 Service服務(wù)詳解

1、前臺(tái)權(quán)限:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

2、Service中開(kāi)啟通知:

class LogUploadService : Service() {

    override fun onBind(arg0: Intent): IBinder? {
        return null
    }

    override fun onCreate() {
        super.onCreate()
        Log.d("caowj", "LogUploadService onCreate")
        initNotification()
    }

    private fun initNotification() {
        val channelName = "埋點(diǎn)上傳"
        val channelId = BuildConfig.APPLICATION_ID

		// 發(fā)送通知,把service置于前臺(tái)
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        // 從Android 8.0開(kāi)始,需要注冊(cè)通知通道
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH)
            notificationManager.createNotificationChannel(channel)
        }
        val notification = NotificationCompat.Builder(this, channelId)
            .setSmallIcon(R.mipmap.app_icon)
            .setContentTitle("埋點(diǎn)Log上報(bào)")
            .setContentText("服務(wù)正在運(yùn)行,請(qǐng)勿關(guān)閉")
            .setAutoCancel(false)
            .setOngoing(true)
            .build()
        // 注意第一個(gè)參數(shù)不能為0
        startForeground(1, notification)
    }

    override fun onDestroy() {
        //停止的時(shí)候銷(xiāo)毀前臺(tái)服務(wù)。
        stopForeground(true);
    }
}


3、啟動(dòng)Service:

// Android 8.0使用startForegroundService在前臺(tái)啟動(dòng)新服務(wù)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(Intent(this, LogUploadService::class.java))
} else {
    startService(Intent(this, LogUploadService::class.java))
}

Android O對(duì)后臺(tái)Service限制怎么解決

4、其他方案:

由于從Android 8.0開(kāi)始禁止應(yīng)用在后臺(tái)運(yùn)行時(shí)創(chuàng)建Service,所以要解決這種這種問(wèn)題有以下幾種方案:

  • 通過(guò)Context.startForegroundService()方式啟動(dòng)一個(gè)前臺(tái)Service,前臺(tái)Service的啟動(dòng)沒(méi)有受到限制。
  • 集成Google Firebase Messaging。
  • 使用JobService;最小周期時(shí)長(zhǎng)為 15 分鐘
  • WorkManager: 周期性任務(wù);最小周期時(shí)長(zhǎng)為 15 分鐘 (與 JobScheduler 相同)

官方建議使用JobScheduler 替換 后臺(tái)Service。

從Android 8.0,使用JobScheduler替換后臺(tái)Service,它會(huì)周期性啟動(dòng)一個(gè)任務(wù),查詢(xún)服務(wù)器,然后退出。相比于后臺(tái)Service,它消耗的資源明顯較少,間接提升了手機(jī)性能。

問(wèn)題補(bǔ)充:

JobService 最小間隔時(shí)間要求大于15分鐘;否則報(bào)錯(cuò):

Requested interval +1m0s0ms for job 10 is too small; raising to +15m0s0ms   
Requested flex +1m0s0ms for job 10 is too small; raising to +5m0s0ms        

WorkManager: 周期性任務(wù)

5、JobScheduler實(shí)現(xiàn)定時(shí)間隔處理

Android之任務(wù)調(diào)度WorkManager和JobSchedule的使用

通過(guò)遞歸的方式,解決最小間隔時(shí)間要求大于15分鐘的限制;

/**
 * JobScheduler實(shí)現(xiàn)定時(shí)間隔處理
 * 通過(guò)遞歸的方式,在onStartJob中,利用setMinimumLatency來(lái)設(shè)置時(shí)間間隔,執(zhí)行完后再重新創(chuàng)建啟用任務(wù)來(lái)實(shí)現(xiàn)
 */
class PeriodicJobService : JobService() {

    override fun onStartJob(p0: JobParameters?): Boolean {
        Log.i(TAG, "onStartJob---")
        startScheduler(this)
        return false
    }

    override fun onStopJob(p0: JobParameters?): Boolean = false

    companion object {
        var TAG: String = "caowj"
        var JOBID: Int = 100
        var InterValTime: Long = 10000
        private var jobScheduler: JobScheduler? = null
        private var jobInfo: JobInfo? = null

        fun startScheduler(context: Context) {
            jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
            cancelScheduler()
            if (jobInfo == null) {
                jobInfo = JobInfo.Builder(JOBID, ComponentName(context, PeriodicJobService::class.java))
                    .setMinimumLatency(InterValTime) // 最小為10秒
                    .build()
            }
            val result = jobScheduler?.schedule(jobInfo!!)
        }

        fun cancelScheduler() {
            jobScheduler?.cancel(JOBID)
        }
    }
}

需要提醒:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-568583.html

  • JobScheduler和WorkManager都只能在APP存活的時(shí)候執(zhí)行,但是定時(shí)器是一直工作的。
  • 關(guān)閉APP再啟動(dòng),JobScheduler并不能夠直接繼續(xù)運(yùn)行,但是WorkManager可以。
  • 如果重啟APP的時(shí)候,WorkManager任務(wù)的計(jì)時(shí)器應(yīng)該已經(jīng)執(zhí)行了一次或多次,則會(huì)立即開(kāi)始執(zhí)行。
  • 重啟App之后WorkManager如果直接執(zhí)行了一個(gè)任務(wù),則從這個(gè)時(shí)候開(kāi)始算新的周期,不會(huì)按舊有周期走。

到了這里,關(guān)于Android啟動(dòng)前臺(tái)服務(wù)(startForegroundService)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android14前臺(tái)服務(wù)適配指南

    Android14前臺(tái)服務(wù)適配指南

    Android 10引入了 android:foregroundServiceType 屬性,用于幫助開(kāi)發(fā)者更有目的地定義前臺(tái)服務(wù)。這個(gè)屬性在Android 14中被強(qiáng)制要求,必須指定適當(dāng)?shù)那芭_(tái)服務(wù)類(lèi)型。以下是可選擇的前臺(tái)服務(wù)類(lèi)型: camera : 相機(jī)應(yīng)用。 connectedDevice : 與連接的設(shè)備相關(guān)的應(yīng)用。 dataSync : 數(shù)據(jù)同步應(yīng)用。

    2024年01月22日
    瀏覽(21)
  • Android app?;睿ㄇ芭_(tái)服務(wù))

    國(guó)內(nèi)廠商定制,除非廠商給app白名單,否則只能用戶(hù)手動(dòng)添加白名單(應(yīng)用自啟和后臺(tái)運(yùn)行),才能通過(guò)前臺(tái)服務(wù)實(shí)現(xiàn)app?;睢?這里介紹前臺(tái)服務(wù)相關(guān)實(shí)現(xiàn)方式。 開(kāi)啟服務(wù): 服務(wù): 清單文件

    2024年02月09日
    瀏覽(22)
  • Android service(服務(wù))中的前臺(tái)服務(wù)

    Android service(服務(wù))中的前臺(tái)服務(wù)

    緊接上文 概述 前臺(tái)服務(wù)是用戶(hù)主動(dòng)意識(shí)到的一種服務(wù),因此在內(nèi)存不足時(shí),系統(tǒng)也不會(huì)考慮將其終止。前臺(tái)服務(wù)必須為狀態(tài)欄提供通知,將其放在運(yùn)行中的標(biāo)題下方。這意味著除非將服務(wù)停止或從前臺(tái)移除,否則不能清除該通知。 針對(duì)上一篇文章中的案例我們可以發(fā)現(xiàn),系

    2024年02月14日
    瀏覽(18)
  • Android入門(mén)教程 | 四大組件之Service(前臺(tái)服務(wù),后臺(tái)服務(wù))

    Android入門(mén)教程 | 四大組件之Service(前臺(tái)服務(wù),后臺(tái)服務(wù))

    Service是一種可在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而不提供界面的應(yīng)用組件。服務(wù)可由其他應(yīng)用組件啟動(dòng),而且即使用戶(hù)切換到其他應(yīng)用,服務(wù)仍將在后臺(tái)繼續(xù)運(yùn)行。 此外,組件可通過(guò)綁定到服務(wù)與之進(jìn)行交互,甚至是執(zhí)行進(jìn)程間通信 (IPC)。 例如,服務(wù)可在后臺(tái)處理網(wǎng)絡(luò)事務(wù)、播放

    2024年02月05日
    瀏覽(34)
  • Android進(jìn)程類(lèi)型及優(yōu)先級(jí)(前臺(tái)進(jìn)程/可見(jiàn)進(jìn)程/服務(wù)進(jìn)程/緩存進(jìn)程/空進(jìn)程)

    Android 進(jìn)程優(yōu)先級(jí) :前臺(tái)進(jìn)程 可見(jiàn)進(jìn)程 服務(wù)進(jìn)程 緩存進(jìn)程 空進(jìn)程 ; 關(guān)鍵優(yōu)先級(jí)進(jìn)程 : 活動(dòng)進(jìn)程 ; 高優(yōu)先級(jí)進(jìn)程 : 可見(jiàn)進(jìn)程 , 服務(wù)進(jìn)程 ; 低優(yōu)先級(jí)進(jìn)程 : 后臺(tái)進(jìn)程 , 空進(jìn)程 ; Android 系統(tǒng)中會(huì)盡量保證優(yōu)先級(jí)高的進(jìn)程的存在時(shí)間盡可能長(zhǎng) ;如果資源不足 ( 這里的資源最主要的是內(nèi)

    2024年04月12日
    瀏覽(19)
  • 車(chē)機(jī) Android 環(huán)境下利用 CarAudioService 實(shí)現(xiàn)自定義 Java 服務(wù)自啟動(dòng)

    注意:本文基于 Android 11/R 進(jìn)行分析 Qidi 2023.11.28 (MarkDown Haroopad) Overlay 實(shí)現(xiàn)的效果正如其字面意思,就是“在原有效果的基礎(chǔ)上再疊加一些效果”。 Android 提供了兩種實(shí)現(xiàn)方式: 編譯時(shí):https://source.android.com/docs/setup/create/new-device#use-resource-overlays 運(yùn)行時(shí):https://source.android.c

    2024年02月05日
    瀏覽(38)
  • Android移動(dòng)應(yīng)用開(kāi)發(fā)——開(kāi)燈與關(guān)燈(小兔子)——實(shí)驗(yàn)八——服務(wù)的啟動(dòng)與關(guān)閉

    Android移動(dòng)應(yīng)用開(kāi)發(fā)——開(kāi)燈與關(guān)燈(小兔子)——實(shí)驗(yàn)八——服務(wù)的啟動(dòng)與關(guān)閉

    ??? ?掌握布局和基本控件的屬性功能及使用方法 ??? ?掌握startService()方法與stopService()方法啟動(dòng)和關(guān)閉服務(wù) 通過(guò)線性布局和相對(duì)布局來(lái)搭建一個(gè)界面,界面效果如下圖所示。當(dāng)點(diǎn)擊“關(guān)燈”按鈕后,轉(zhuǎn)變到第二個(gè)狀態(tài)。在第二個(gè)狀態(tài)中,點(diǎn)擊“開(kāi)燈”按鈕后,跳轉(zhuǎn)回第一

    2024年02月05日
    瀏覽(27)
  • android服務(wù)啟動(dòng)失敗Unable to start service Intent U=0: not found

    android啟動(dòng)服務(wù)失敗,提示:Unable to start service Intent { cmp=xxx/.xxx} U=0: not found。檢查清單文件服務(wù)配置沒(méi)有錯(cuò),啟動(dòng)服務(wù)的方法也沒(méi)錯(cuò)。 場(chǎng)景:我的程序是系統(tǒng)應(yīng)用,運(yùn)行于9.0,作為launcher使用,在application onCreate中啟動(dòng)服務(wù)。試過(guò)延遲啟動(dòng)服務(wù)和配置action和Package的方式啟動(dòng)服

    2024年02月11日
    瀏覽(17)
  • 【Android平板編程】遠(yuǎn)程Ubuntu服務(wù)器code-server編程寫(xiě)代碼

    【Android平板編程】遠(yuǎn)程Ubuntu服務(wù)器code-server編程寫(xiě)代碼

    ??本次教程將在 Ubuntu 服務(wù)器環(huán)境下安裝 code-server ,并使用 Android 安卓平板遠(yuǎn)程 Ubuntu 服務(wù),進(jìn)行遠(yuǎn)程編程開(kāi)發(fā)寫(xiě)代碼。同時(shí)搭配 cpolar 內(nèi)網(wǎng)穿透工具,實(shí)現(xiàn)公網(wǎng)環(huán)境下異地遠(yuǎn)程訪問(wèn)Ubuntu的code-server。 ??準(zhǔn)備一臺(tái)虛擬機(jī),Ubuntu或者centos都可以,這里以 VMwhere ubuntu 系統(tǒng)為例 ?

    2023年04月14日
    瀏覽(30)
  • 【Linux】Android平板上遠(yuǎn)程連接Ubuntu服務(wù)器code-server進(jìn)行代碼開(kāi)發(fā)

    【Linux】Android平板上遠(yuǎn)程連接Ubuntu服務(wù)器code-server進(jìn)行代碼開(kāi)發(fā)

    準(zhǔn)備一臺(tái)虛擬機(jī),Ubuntu或者centos都可以,這里以VMwhere ubuntu系統(tǒng)為例 下載code server服務(wù),瀏覽器訪問(wèn):https://github.com/coder/code-server,復(fù)制下載鏈接 打開(kāi)ubuntu命令行下載 出現(xiàn)需要輸入ubuntu的登錄賬戶(hù)密碼,輸入密碼即可,然后等待安裝完成 以下信息表示安裝成功 接著輸入以下命

    2024年02月05日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包