首页 > 解决方案 > 我可以在 Android 中将类(BroadcastReceiver)作为方法参数传递吗?

问题描述

我的 Android 程序有几十个广播接收器,做各种不同的事情,因此制作一个通用的接收器来处理所有事情是不切实际的。但是我发现自己有超过 1000 行代码,一遍又一遍地做同样的事情,只是将 AlarmManagers 设置为指向 BroadcastReceivers。

例如:

    public void startStatsAlarm() {
        Log.d(TAG, "startStatsAlarm: in start alarm");
        boolean alarmUp = (PendingIntent.getBroadcast(mContext, 1,
            new Intent(mContext, StatsAlarmReceiver.class),
            PendingIntent.FLAG_NO_CREATE) != null);

        if(alarmUp){
            Log.d(TAG, "startStatsAlarm: alarm already up, skipping");
            return;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(System.currentTimeMillis());
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 30);

        AlarmManager alarmMgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(mContext, StatsAlarmReceiver.class);
        PendingIntent statsIntent = PendingIntent.getBroadcast(mContext, 1, intent, 0);
        if (alarmMgr != null) {
            alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, statsIntent);
    }
}

是众多之一。我唯一需要更改的是 MINUTE 和 HOUR、Interval 和 BroadcastReceiver。一定有某种方法可以重用相同的代码,而不是一遍又一遍地使用相同的东西?

标签: javaandroid

解决方案


尝试这个 :

public void startStatsAlarm(Context mContext, BroadcastReceiver mClass, int hour, int minute) {
        Log.d(TAG, "startStatsAlarm: in start alarm");
        boolean alarmUp = (PendingIntent.getBroadcast(mContext, 1,
                new Intent(mContext, mClass.getClass()),
                PendingIntent.FLAG_NO_CREATE) != null);
        if (alarmUp) {
            Log.d(TAG, "startStatsAlarm: alarm already up, skipping");
            return;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(System.currentTimeMillis());
        cal.set(Calendar.HOUR_OF_DAY, hour);
        cal.set(Calendar.MINUTE, minute);
        AlarmManager alarmMgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(mContext, mClass.getClass());
        PendingIntent statsIntent = PendingIntent.getBroadcast(mContext, 1, intent, 0);
        if (alarmMgr != null) {
            alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, statsIntent);
        }
    }

推荐阅读