如何在其他活动上调用方法?

时间:2018-09-17 16:20:54

标签: android kotlin

我正在开发一个频繁使用通知的android应用。

我选择通过设置活动而不是主要活动来设置警报,但是我无法在按下开关后立即通过setActivity找出如何取消警报管理器。

我只发现了如何在MainActivity上取消通知,只有在关闭并打开应用程序后,通知才会停止。

首选的方法是什么?

来自SettingActivity.kt:

class NotificationPreferenceFragment : PreferenceFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        addPreferencesFromResource(R.xml.pref_notification)
        setHasOptionsMenu(false)

        var switchPref: Preference = findPreference(getString(R.string.pref_notifications_switch_key))

        switchPref.onPreferenceChangeListener = OnPreferenceChangeListener { preference, isChecked ->
            var toast: Toast = if (isChecked as Boolean) {
                Toast.makeText(activity, "switch is ON", Toast.LENGTH_SHORT)

            } else {
                Toast.makeText(activity, "notifications is OFF", Toast.LENGTH_SHORT)

            }
            toast.show()
            true
        }
    }

从MainActivity取消方法:

fun cancelAlarm() {
    alarmMgr = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
    val intent1 = Intent(applicationContext, AlarmReceiver::class.java)
    alarmIntent = PendingIntent.getBroadcast(applicationContext, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT)
    alarmMgr!!.cancel(alarmIntent)
}

1 个答案:

答案 0 :(得分:0)

正如评论者所说,只需使用BroadcastReceiver

NotificationPreferenceFragment.java

class NotificationPreferenceFragment : PreferenceFragment() {

    val broadcaster: LocalBroadcastManager? = null;

    override fun onCreate(savedInstanceState: Bundle?) {
        broadcaster = LocalBroadcastManager.getInstance(this);
    }

    // Inside your onPreferenceChangeListener, depends on when you want to call it, either ON or OFF
    Intent intent = new Intent("YOUR_DATA_STRING");
    intent.putExtra(ANY_EXTRAS_STRING, DATA_ITSELF);
    broadcaster.sendBroadcast(intent);
}

MainActivity.java

import android.support.v4.content.LocalBroadcastManager;




    override fun onStart() {
        super.onStart()
        LocalBroadcastManager.getInstance(this).registerReceiver(MYReceiver,
                IntentFilter("YOUR_DATA_STRING")
        )
    }

    private val MYReceiver = object : BroadcastReceiver() {
        fun onReceive(context: Context, intent: Intent) {
            if (intent.extras != null) {
                // get any extras if neccessary
                // intent.extras!!.getString("ANY_EXTRAS_STRING")
                cancelAlarm()
            }
        }
    }

    override fun onStop() {
        super.onStop()
        LocalBroadcastManager.getInstance(this).unregisterReceiver(MYReceiver)
    }