2016-09-14 53 views
1

当调用与报警管理类我得到的错误说:如何通过Alarm Manager传递构造函数?

“无零个构造法”有没有办法通过构造函数或对象与AlarmManager或者是我唯一的选择只是增加一个方法没有构造函数?

(不使用串行化方法)

编辑:

(从服务类被调用) 报警管理器代码:

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"); 
    } 
} 

目标:

我想打电话给collectData()从同一DataCollector实例的每个〜5分钟,以收集数据,并显示在该通知。

+1

请详细解释“用Alarm Manager调用课程”的含义。例如,您可能会发布[mcve]。 – CommonsWare

+0

更新了说明 – atanti

回答

0

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

没有在Java中没有什么概念“通构造”的。

您使用AlarmManagerPendingIntent。 A PendingIntent又与ActivityServiceBroadcastReceiver一起使用。所有这些都需要一个零参数public构造函数,因为所有Android框架都知道如何使用这些类来创建这些类的实例。

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

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

您使用AlarmManagerPendingIntent。 A PendingIntent又与ActivityServiceBroadcastReceiver一起使用。您需要创建一个ActivityServiceBroadcastReceiver供您与AlarmManager一起使用,不包含构造函数,但另有您选择使用这些组件所需的方法(例如,onReceive()用于BroadcastReceiver)。

在你的代码示例中,你可能会将lc = new LocationControl(context);移动到onReceive()。您的DataCollector将用于一个致电onReceive(),然后丢弃,因此您需要每次都创建新的LocationControl对象。

我想打电话给collectData()从同一DataCollector实例的每个〜5分钟,以收集数据,并显示在通知

这不是如何Android的作品。请DataCollector将其数据保存在某处(数据库,SharedPreferences或其他文件),根据需要重新加载。如果你想拥有这种信息的单态缓存,这很好,只要你小心避免内存泄漏。然而,它只是只是一个缓存;您的过程可以在AlarmManager事件之间终止,因此您无法依赖于在任何给定事件中填充的缓存。

相关问题