BroadcastReceiverによるメモリリークが修正できた件。

  時計アプリを作っていて、アラーム時刻をサービスに送ろうとしてBroadcastReceiverを使ったら、メモリリークが発生。しかしそれを何とか修正した件。


最初に作った送信側のActivityがこれ。
class MainActivity : AppCompatActivity() {
   
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_zoperation)

        //MyReceiverの登録
        val filter1 = IntentFilter()
        filter1.addAction("this_is_alarm_time")
        registerReceiver(MyReceiver(), filter1)
        
        //ボタンを押すと        
        findViewById(R.id.button).setOnClickListener{
        
        //目覚まし時刻の入力(4桁の数字を入力)
        val alarmTime:String = findViewById(R.id.inputAlarmTime) .text.toString()
        
        val intent = Intent("this_is_alarm_time").apply {
            putExtra("alarmTime", alarmTime)
        }
        sendBroadcast(intent)
        }
	}

}
受け側はこんな感じ。
var alarmTime2: String = ""

class MyService : Service() {

    //MyReceiverをここに置く。
    class MyReceiver: BroadcastReceiver() {
        override fun onReceive(p0: Context?, intent: Intent?) {

             alarmTime2 =intent?.getStringExtra("intAlarmHour")?
        }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
        //以下、alarmTime2を使って、目覚ましの設定を行う。
    }


 ところがこれでは、最初のMainActivityでメモリリークが起きてしまう。

 これをなくすには、MainActivityを変える必要がある。つまり、レシーバーをnull許容型にしてonCreateよりも前にクラス全体の変数として定義し、最初はnullとしておく。そして、最後にonDestroyの中でunregisterRceiverを呼んで解放する。

class MainActivity : AppCompatActivity() {

	var myReceier:MyService.MyReceiver? = null
   
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_zoperation)

        //MyReceiverの登録
        val filter1 = IntentFilter()
        filter1.addAction("this_is_alarm_time")
        myReceiver = MyService.MyReceiver()
        registerReceiver(myReceiver(), filter1)
        
        //ボタンを押すと        
        findViewById(R.id.button).setOnClickListener{
        
        //目覚まし時刻の入力(4桁の数字を入力)
        val alarmTime:String = findViewById(R.id.inputAlarmTime) .text.toString()
        
        val intent = Intent("this_is_alarm_time").apply {
            putExtra("alarmTime", alarmTime)
        }
        sendBroadcast(intent)
        }
	}

    override fun onDestroy(){
     super.onDestroy()
      unregisterReceiver(myReceiver) 
    }
}

 しかしこれがわかるまでにだいぶ時間がかかってしまった。  https://qiita.com/toastkidjp/items/c1bd3306adababfad254  こちらのページを参考にさせてもらって、解決できました。  ありがとうございました。

コメント

このブログの人気の投稿

目覚まし時計アプリを公開します

超初心者の機械学習入門

画面回転で苦労した話(原因はわかった)