亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Android(事物):如何在程序結束前進行清理?

Android(事物):如何在程序結束前進行清理?

喵喔喔 2021-08-25 17:44:32
我有一個運行 Android Things 的 Raspberry Pi 3。為簡單起見,假設它只旋轉步進電機。為了再次簡化事情,步進電機通過逐個線圈告訴哪些充電哪些不充電來旋轉。在 Raspberry Pi 中,您將四個輸出引腳連接到步進電機的四個輸入引腳。然后你以連續的順序一個接一個地啟動引腳,每次運行之間有幾毫秒。如果我通過按 Stop 'MainActivity' 停止 Android Studio 中的程序,程序代碼將被終止,但 Raspberry Pi 中的輸出引腳仍保持充電狀態。就我而言,如果我在 Android Studio 中停止該程序,我的一個步進電機線圈會保持充電狀態(并且會過熱)。問題:在程序關閉之前在 Android 中進行清理的最佳方法是什么?我已經嘗試過 onDestroy() 和 onPause() 但是當程序關閉時這兩個都不能保證被調用。(他們也從來沒有在我的情況下工作過)。我還嘗試添加關閉掛鉤,但即使如此也不會關閉輸出引腳。位于 MainActivity 的 onCreate() 方法中的 shutdownhook 如下所示:@Overrideprotected void onCreate(Bundle savedInstanceState) {? ? super.onCreate(savedInstanceState);? ? Runtime.getRuntime().addShutdownHook(new Thread(){? ? ? ? @Override? ? ? ? public void run(){? ? ? ? ? ? try{? ? ? ? ? ? ? ? mRobotics.stopMotor();? ? ? ? ? ? } catch (Exception e){? ? ? ? ? ? ? ? // Ignore error? ? ? ? ? ? }? ? ? ? }? ? });// onCreate continues...stopMotor() 方法如下所示:public void stopMotor(){? ? this.motorHandler.removeCallbacksAndMessages(null);? ? try {? ? ? ? mStepper1.setValue(false);? ? ? ? mStepper2.setValue(false);? ? ? ? mStepper3.setValue(false);? ? ? ? mStepper4.setValue(false);? ? } catch (Exception e){? ? ? ? // Nothing here? ? }}有很多相關的問題,例如,在程序關閉時停止線程。
查看完整描述

1 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

您是正確的,單擊 Android Studio 中的停止按鈕只會終止您的應用程序進程,而不調用任何生命周期方法。如果您的應用程序崩潰或 Android 由于內存壓力需要終止您的應用程序,情況也是如此,因此這也可能在運行時發生。每次可能發生這種情況時,您都無法添加任何鉤子來進行預測。


一種選擇是將您的電機驅動程序邏輯移動到一個單獨的應用程序模塊中,并通過綁定服務來控制它。這樣,當主應用程序終止時(在開發過程中或由于崩潰),驅動程序應用程序可以適當地管理它。以這種方式將您的驅動程序代碼與您的主應用程序分開通常也是一個很好的關注點分離。


下面是一個示例:


驅動程序.apk


class MotorDriverService : Service() { 


    override fun onCreate() {

        super.onCreate()

        startMotor()

    }


    override fun onDestroy() {

        super.onDestroy()

        stopMotor()

    }

}

主文件


class MainActivity : Activity() { 


    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        val intent = ...

        bindService(intent, connection, Context.BIND_AUTO_CREATE)

    }


    override fun onDestroy() {

        super.onDestroy()

        unbindService(connection)

    }


    private val connection = object : ServiceConnection {

        override fun onServiceConnected(className: ComponentName, service: IBinder) { }


        override fun onServiceDisconnected(name: ComponentName) { }

    }

}

這樣做更好的原因是因為綁定的服務連接是自動管理的。Android 在 Activity 想要綁定到它時創建服務,并在沒有更多客戶端綁定時銷毀它(在這種情況下也會發生在 main.apk 終止或崩潰時)。


驅動程序和主程序必須是兩個獨立的應用程序(不是同一 APK 中的活動/服務),因為這僅在兩者在完全獨立的進程中運行時才有效。


查看完整回答
反對 回復 2021-08-25
  • 1 回答
  • 0 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號