使用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()来收集数据并在通知中显示它。
答案 0 :(得分:0)
有没有办法通过AlarmManager传递构造函数或对象
Java中没有概念传递构造函数"。
您将AlarmManager
与PendingIntent
一起使用。反过来,PendingIntent
适用于Activity
,Service
或BroadcastReceiver
。所有这些都需要零参数public
构造函数,因为这是所有Android框架都知道如何使用它来创建这些类的实例。
是我唯一的选择,只是添加一个没有构造函数的方法?
Java中没有构造函数方法的概念。
您将AlarmManager
与PendingIntent
一起使用。反过来,PendingIntent
适用于Activity
,Service
或BroadcastReceiver
。您需要为Activity
创建一个Service
,BroadcastReceiver
或AlarmManager
,而不使用构造函数,但除此之外,还需要使用这些组件中所需的方法您选择使用(例如onReceive()
作为BroadcastReceiver
)。
在您的代码示例中,您也可以将lc = new LocationControl(context);
移至onReceive()
。您的DataCollector
将用于一次对onReceive()
的调用,然后被丢弃,因此您每次都需要创建新的LocationControl
个对象。
我想每隔约5分钟从同一个DataCollector实例调用collectData()来收集数据并在通知中显示
这不是Android的工作方式。让DataCollector
将数据保存在某处(数据库,SharedPreferences
或其他文件),并根据需要重新加载。如果你想拥有这种信息的某种单独缓存,那就好了,只要你小心避免内存泄漏。但是,它只是一个缓存;您的进程可以在AlarmManager
个事件之间终止,因此您不能依赖于在任何给定事件上填充的缓存。