2016-09-14 59 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事件之間終止,因此您無法依賴於在任何給定事件中填充的緩存。

相關問題