BroadcastReceiverによるメモリリークが修正できた件。
時計アプリを作っていて、アラーム時刻をサービスに送ろうとしてBroadcastReceiverを使ったら、メモリリークが発生。しかしそれを何とか修正した件。
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
こちらのページを参考にさせてもらって、解決できました。
ありがとうございました。
コメント
コメントを投稿