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

安卓開發(fā)后臺應(yīng)用周期循環(huán)獲取位置信息上報服務(wù)器

這篇具有很好參考價值的文章主要介紹了安卓開發(fā)后臺應(yīng)用周期循環(huán)獲取位置信息上報服務(wù)器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題背景

最近有需求,在APP啟動后,退到后臺,還要能實現(xiàn)周期獲取位置信息上報服務(wù)器,研究了一下實現(xiàn)方案。

問題分析

一、APP退到后臺后網(wǎng)絡(luò)請求實現(xiàn)
APP退到后臺后,實現(xiàn)周期循環(huán)發(fā)送網(wǎng)絡(luò)請求。目前嘗試了兩種方案是OK,如下:
(1)AlarmManager + 前臺服務(wù) +廣播的方案,可以正常實現(xiàn),大體思路是,啟動一個前臺服務(wù),使用AlarmManager發(fā)起一個定時廣播,然后廣播接收器接收到廣播后,循環(huán)去執(zhí)行service的操作。
(2)使用jetpeck庫提供的worker實現(xiàn),基于PeriodicWorkRequest實現(xiàn)一個周期執(zhí)行的任務(wù),比如周期設(shè)置為15分鐘,可以在后臺穩(wěn)定執(zhí)行。
二、APP退到后臺后獲取地理位置實現(xiàn)
APP申請位置時,用戶選擇了列表中的始終允許后,APP在后臺是可以正常獲取到位置信息的。不過這里有個坑,因為安卓11版本后退位置信息管控策略進(jìn)行了更新,如果APP的target sdk版本大于29時,需要分別申請前臺位置權(quán)限和后臺位置權(quán)限,本APPtargetsdk是小于等于29的,可以同時申請前臺位置權(quán)限和后臺位置權(quán)限。(compileSdkVersion小于29時,會沒有這個后臺位置權(quán)限,需要最好升級到29)

問題解決

下面展示大概的代碼,可以參考實現(xiàn)。
(1)引入依賴

api('androidx.work:work-runtime:2.0.1')

(2)manifest文件中增加申請權(quán)限

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 這個權(quán)限用于訪問GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會用于進(jìn)行網(wǎng)絡(luò)定位 -->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

(3)權(quán)限申請(同時申請位置權(quán)限和后臺位置權(quán)限)

        RxPermissionHelper helper = new RxPermissionHelper(this);
        helper.requestEach(new RxPermissionHelper.PermissionCallback() {
            @Override
            public void granted(String permissionName) {
                LogUtil.writerLog("ACCESS_FINE_LOCATION granted");
            }

            @Override
            public void denied(String permissionName, boolean forever) {

            }

            @Override
            public void result(boolean allGranted) {

            }
        }, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION);

(4)work類:去執(zhí)行前臺服務(wù)


/**
 * work類執(zhí)行定時任務(wù)
 */
public class SimpleWorker extends Worker {
    private CurPosUtil curPosUtil;

    public SimpleWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }
    @NonNull
    @Override
    public Result doWork() {
        Log.d("baorant", "執(zhí)行調(diào)度任務(wù)");
        LogUtil.writerLog("執(zhí)行調(diào)度任務(wù)");
        startService();
        return Result.success();
    }

    private void startService() {
//        curPosUtil = new CurPosUtil(getApplicationContext());
        Intent intent = new Intent(getApplicationContext(), RecordService.class);
        getApplicationContext().startService(intent);
    }
}

(5)RecordService前臺服務(wù)類(需要在manifest文件中配置)

/**
 * 一個定時任務(wù)
 *
 * 方案:使用前臺服務(wù)去執(zhí)行網(wǎng)絡(luò)請求,定時發(fā)送廣播,然后在廣播接收器中重新啟動服務(wù),實現(xiàn)循環(huán)后臺服務(wù)。
 */
public class RecordService extends Service {
    private CurPosUtil curPosUtil;

    /**
     * 每30秒更新一次數(shù)據(jù)
     */
    private static final int ONE_Miniute= 30 * 1000;
    private static final int PENDING_REQUEST=0;
    int count = 0;

    public RecordService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        curPosUtil = new CurPosUtil(getApplicationContext());
        LogUtil.writerLog("RecordService onCreate");

        if (Build.VERSION.SDK_INT >=    Build.VERSION_CODES.O) {
            String NOTIFICATION_CHANNEL_ID = "package_name";
            String channelName = "My Background Service";
            NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,channelName, NotificationManager.IMPORTANCE_LOW);
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            manager.createNotificationChannel(channel);
            Notification notification = new Notification.Builder(this,NOTIFICATION_CHANNEL_ID)
                    .setSmallIcon(R.drawable.ic_dial_icon)  // the status icon
                    .setWhen(System.currentTimeMillis())  // the time stamp
                    .setContentText("定時服務(wù)正在運行")  // the contents of the entry
                    .build();

            startForeground(2, notification);
        }
    }

    /**
     * 調(diào)用Service都會執(zhí)行到該方法
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        LogUtil.writerLog("RecordService:  onStartCommand");

        // 這里模擬后臺操作
        initPos();

        return super.onStartCommand(intent, flags, startId);
    }

    private void initPos() {
        curPosUtil = new CurPosUtil(this);
        curPosUtil.getCurPos(new CurPosUtil.CurPosCallback() {
            @Override
            public void getCurPos(double s, double s1, String s2) {
                LogUtil.writerLog(DateUtil.timeToDate(String.valueOf(System.currentTimeMillis())));
                LogUtil.writerLog("getCurPos: " + s + " " + s1 + " " + s2);
                commonLogin(s + " " + s1 + " " + s2);
            }
        });
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public void commonLogin(String position) {
        RetrofitHelper.getInstance().login(position, "", "", "",
                        "", "", "", "")
                .subscribe(new Observer<Boolean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Boolean aBoolean) {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

(6)activity中啟動周期任務(wù),周期15分鐘循環(huán)執(zhí)行

 PeriodicWorkRequest.Builder request =
                        new PeriodicWorkRequest.Builder(SimpleWorker.class, 15
                                , TimeUnit.MINUTES).addTag("simpleTask");
                LogUtil.writerLog(DateUtil.timeToDate(String.valueOf(System.currentTimeMillis())));
                LogUtil.writerLog("點擊執(zhí)行task");
                WorkManager.getInstance().enqueue(request.build() );

(7)LogUtil工具類,輸出日志到文件,方便定位

/**
 * 日志工具,輸出日志到文件
 */
public class LogUtil {

    /**
     * 路徑 "/data/data/com包名/files/backLogTest"
     *
     * @param msg 需要打印的內(nèi)容
     */
    public static void writerLog(String msg) {
        Log.d("baorant", msg);
        // 保存到的文件路徑
        final String filePath = App.getContext().getFilesDir().getPath();
        FileWriter fileWriter;
        BufferedWriter bufferedWriter = null;

        try {
            // 創(chuàng)建文件夾
            File dir = new File(filePath, "backLogTest");
            if (!dir.exists()) {
                dir.mkdir();
            }
            // 創(chuàng)建文件
            File file = new File(dir, "lowTemperature.txt");
            if (!file.exists()) {
                file.createNewFile();
            }
            // 寫入日志文件
            fileWriter = new FileWriter(file, true);
            bufferedWriter = new BufferedWriter(fileWriter);
            bufferedWriter.write( msg + "=======時間 :"+ getCurrentTime()+ "\n");
            bufferedWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }

    private static String getCurrentTime() {
        Calendar calendar = Calendar.getInstance();
        @SuppressLint("SimpleDateFormat")
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return  sdf.format(calendar.getTime());
    }
}

問題總結(jié)

運行結(jié)果如下:
安卓開發(fā)后臺應(yīng)用周期循環(huán)獲取位置信息上報服務(wù)器,移動開發(fā),android,服務(wù)器,運維
安卓開發(fā)后臺應(yīng)用周期循環(huán)獲取位置信息上報服務(wù)器,移動開發(fā),android,服務(wù)器,運維
如結(jié)果所示,基于該方案可以實現(xiàn)APP在后臺,周期循環(huán)獲取位置信息并進(jìn)行上報,有興趣的同學(xué)可以進(jìn)一步深入研究。文章來源地址http://www.zghlxwxcb.cn/news/detail-603555.html

到了這里,關(guān)于安卓開發(fā)后臺應(yīng)用周期循環(huán)獲取位置信息上報服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • uniapp開發(fā)小程序解析經(jīng)緯度獲取當(dāng)前位置信息(高德地圖三)

    uniapp開發(fā)小程序解析經(jīng)緯度獲取當(dāng)前位置信息(高德地圖三)

    選擇了高德地圖定位 高德地圖官網(wǎng) 小程序步驟如下: ? ? ?1.首先創(chuàng)建應(yīng)用 ? ? ??2.點擊增添key按鈕申請小程序key ? ? ? ? 3.然后下載它的微信小程序版 SDK:微信小程序 SDK ? ? ? ? 4.把下載的sdk放在公共的文件里,這里我放在了utils文件目錄下 ? ? ? ? ?5.使用頁面導(dǎo)入此

    2024年02月02日
    瀏覽(102)
  • 安卓實戰(zhàn)開發(fā)之——使用 WIFI 進(jìn)行設(shè)備搜索并獲取相應(yīng)信息

    安卓實戰(zhàn)開發(fā)之——使用 WIFI 進(jìn)行設(shè)備搜索并獲取相應(yīng)信息

    目錄 一、前言 二、準(zhǔn)備條件 三、功能要求 四、顯示效果 五、關(guān)鍵代碼? 此玩意是本人很早很早(記不清有多早了,反正很早)做過的一個課程任務(wù)了,無意之中翻到了,所以把它放上來。不愿再找以前寫的代碼了,所以放的文檔里的截圖。 首先需要安裝配置好Java開發(fā)環(huán)境

    2024年02月09日
    瀏覽(38)
  • uni.app開發(fā)小程序如何獲取當(dāng)前經(jīng)緯度、位置信息以及如何重新發(fā)起授權(quán)定位
  • pyautogui獲取鼠標(biāo)位置及循環(huán)點擊指定位置按鈕

    pip install pyautogui可能會安裝失敗,需要先下載包再按照。 由于本機利用的是anconda里的python環(huán)境,所以下載后的安裝步驟為: 下載包至本地:PyAutoGUI-0.9.53.tar.gz 下載地址 cd 至包下載目錄下 執(zhí)行命令 conda install --use-local PyAutoGUI-0.9.53.tar.gz -n base 對應(yīng)含義: conda install --use-local 包文

    2024年02月11日
    瀏覽(27)
  • GPT應(yīng)用開發(fā):編寫插件獲取實時天氣信息

    GPT應(yīng)用開發(fā):編寫插件獲取實時天氣信息

    歡迎閱讀本系列文章!我將帶你一起探索如何利用OpenAI API開發(fā)GPT應(yīng)用。無論你是編程新手還是資深開發(fā)者,都能在這里獲得靈感和收獲。 本文,我們將繼續(xù)展示聊天API中插件的使用方法,讓你能夠輕松駕馭這個強大的工具。 首先給大家展示下插件的運行效果,如下圖所示:

    2024年01月20日
    瀏覽(25)
  • 微信小程序—獲取用戶位置信息

    微信小程序—獲取用戶位置信息

    代碼: 結(jié)果示例: 接下來我們需要經(jīng)度(longitude)和緯度(latitude)兩個屬性

    2024年02月08日
    瀏覽(21)
  • Unity 獲取手機地理位置信息

    在游戲的開發(fā)過程中,有時候會遇到需要獲取玩家位置信息的需求,比如顯示玩家所在的國家城市等。 有一下方法可以參考: 可以根據(jù)手機的地區(qū)和語言來做判斷。 根據(jù)IP來判斷所處的位置,阿里云啥的都有對應(yīng)的接口服務(wù)。 根據(jù)GPS來判斷。 以上方法都各有利弊吧,這里簡

    2024年02月12日
    瀏覽(19)
  • 通過ip獲取地理位置信息

    GeoLite2-City.mmdb 文件是 MaxMind 公司提供的一個免費的 IP 地址與城市地理位置映射數(shù)據(jù)庫文件。它包含了 IP 地址范圍與對應(yīng)的城市、地區(qū)、國家、經(jīng)緯度等地理位置信息的映射。這種數(shù)據(jù)庫文件可以用于識別訪問您的應(yīng)用程序或網(wǎng)站的用戶的地理位置,從而實現(xiàn)針對不同地區(qū)的

    2024年02月12日
    瀏覽(20)
  • uniapp獲取用戶當(dāng)前位置信息(第一節(jié))

    uniapp獲取用戶當(dāng)前位置信息(第一節(jié))

    本篇文章分享一下我在實際開發(fā)小程序時遇到的需要獲取用戶當(dāng)前位置的問題,在小程序開發(fā)過程中經(jīng)常使用到的獲取定位功能。uniapp官方也提供了相應(yīng)的API供我們使用。 官網(wǎng)地址:uni.getLocation(OBJECT)) 首先根據(jù)官網(wǎng)uni.getLocation(OBJECT))來獲取地理位置信息 注意:這里面有個大

    2024年02月17日
    瀏覽(19)
  • Golang — 根據(jù)IP獲取地理位置信息

    Golang — 根據(jù)IP獲取地理位置信息

    1 ip2region 2 geoip2-golang ip2region 是一個離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,10微秒級別的查詢效率,提供了眾多主流編程語言的 xdb 數(shù)據(jù)生成和查詢客戶端實現(xiàn)。 特點: 是一個開源的IP地理位置庫。 標(biāo)準(zhǔn)化的數(shù)據(jù)格式 每個 ip 數(shù)據(jù)段的 region 信息都固定了格式:國家|區(qū)域|省

    2024年02月14日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包