如何通过Alarm Manager传递构造函数?

时间:2016-09-14 14:24:45

标签: android alarmmanager

使用Alarm Manager调用类时,我收到错误消息:

“没有零构造函数的方法”

有没有办法用AlarmManager传递构造函数或对象,或者我只是添加一个没有构造函数的方法?

(不使用Serializable方法)

编辑:

(从Service类调用) 警报管理器代码:

public void startCollector(){
        final int LOOP_REQUEST_CODE = 4;
        Intent i = new Intent(getApplicationContext(),DataCollector.class);
        PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(),LOOP_REQUEST_CODE,i,0);
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 3*1000;
        Log.v("SPAM","Set");

        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 1000, sender);
    }

被叫类代码:

package com.project.backgroundprocesstest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class DataCollector extends BroadcastReceiver{
    LocationControl lc = null;
    public DataCollector(){

    }
    public DataCollector(Context context){
        lc = new LocationControl(context);
    }
    @Override
    public void onReceive(Context context,Intent intent){
        collectData(context);
    }
    private void collectData(Context context){
        HttpConnect conn = new HttpConnect();
        try {
            if (lc.getLocation() != null)
                Log.v("SPAM", lc.getLocation());
        }catch (NullPointerException e){

        }
        Log.v("SPAM", "SEND");
    }
}

目标:

我想每隔约5分钟从同一个DataCollector实例调用collectData()来收集数据并在通知中显示它。

1 个答案:

答案 0 :(得分:0)

  

有没有办法通过AlarmManager传递构造函数或对象

Java中没有概念传递构造函数"。

您将AlarmManagerPendingIntent一起使用。反过来,PendingIntent适用于ActivityServiceBroadcastReceiver。所有这些都需要零参数public构造函数,因为这是所有Android框架都知道如何使用它来创建这些类的实例。

  

是我唯一的选择,只是添加一个没有构造函数的方法?

Java中没有构造函数方法的概念。

您将AlarmManagerPendingIntent一起使用。反过来,PendingIntent适用于ActivityServiceBroadcastReceiver。您需要为Activity创建一个ServiceBroadcastReceiverAlarmManager,而不使用构造函数,但除此之外,还需要使用这些组件中所需的方法您选择使用(例如onReceive()作为BroadcastReceiver)。

在您的代码示例中,您也可以将lc = new LocationControl(context);移至onReceive()。您的DataCollector将用于一次onReceive()的调用,然后被丢弃,因此您每次都需要创建新的LocationControl个对象。

  

我想每隔约5分钟从同一个DataCollector实例调用collectData()来收集数据并在通知中显示

这不是Android的工作方式。让DataCollector将数据保存在某处(数据库,SharedPreferences或其他文件),并根据需要重新加载。如果你想拥有这种信息的某种单独缓存,那就好了,只要你小心避免内存泄漏。但是,它只是一个缓存;您的进程可以在AlarmManager个事件之间终止,因此您不能依赖于在任何给定事件上填充的缓存。