2011-01-31 70 views
1

当用户检查CheckBox并将时间设置为TimePickerDialog并且时间到了时,服务将通过BroadcastReceiver开始并且音乐每6秒播放一次。由于这是Service,即使我重新启动应用程序,音乐仍然每6秒播放一次。 同样我创建了另一个服务来保存CheckBox的状态,因为如果时间还没有到来,用户关闭然后打开应用程序,CheckBox仍然必须签入。我创建了一个全局变量来管理复选框的状态:服务问题

main.java:

Intent intentA = new Intent(main.this, AlarmReceiverA.class); 
PendingIntent pendingIntentA = PendingIntent.getBroadcast(main.this, 0, 
     intentA, PendingIntent.FLAG_ONE_SHOT); 
alarmManagerA = (AlarmManager) getSystemService(ALARM_SERVICE); 
Calendar now = Calendar.getInstance(); 
alarmManager.set(AlarmManager.RTC_WAKEUP, now.getTimeInMillis(), pendingIntentA); 
Toast.makeText(main.this, "Present time: " + 
     String.valueOf(now.getTime()), Toast.LENGTH_SHORT).show(); 

这是很容易AlarmReceiver启动服务:

public final class AlarmReceiverA extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "AlarmA worked.", Toast.LENGTH_LONG).show(); 
     context.startService(new Intent(context, MyServiceA.class)); 
    } 
} 

这是MyServiceA.class:

@Override 
public void onCreate() { 
    Toast.makeText(this, "My ServiceA Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 
    GlobalVars.setTimeWatch(1); 
} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My ServiceA Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My ServiceA Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 
    GlobalVars.setTimeWatch(1); 
} 

我得到“我的服务启动”吐司消息,所以这一直工作到目前为止。问题是即使我将变量设置为1 GlobalVars.setTimeWatch(1)当我重新启动应用程序时,我没有收回它。

在main.java我检查这个变量的值:

public void onResume() { 
    super.onResume(); 
    Toast.makeText(main.this, String.valueOf(GlobalVars.getTimeWatch()), 
      Toast.LENGTH_SHORT).show(); 
} 

但是,所有我得到的是0问题一定与服务,因为当我打开了一个新的画面(例如,通过点击在一个按钮上),然后返回,我得到值为“1”的Toast消息。

  1. 这是保存CheckBox状态的方法吗?
  2. 代码有什么问题?

我也是这个尝试:

@Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putBoolean("MyBoolean", cbstate); 
    super.onSaveInstanceState(savedInstanceState); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    myb = savedInstanceState.getBoolean("MyBoolean"); 
} 

cbstate是布尔变量。在OnCreate方法,我检查cbstate的价值:

if (myb == true) 
     { 
      cb1.setChecked(true); 
      Toast.makeText(main.this, "checked", Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
      cb1.setChecked(false); 
      Toast.makeText(main.this, "Not checked", Toast.LENGTH_SHORT).show(); 
     } 

重新启动应用程序我总是得到“未检查”之后。

回答

0

当浏览我的开放问题时,我发现这个问题,即使我在2年前问过它,我也需要回答它以帮助其他人。我不打算为这个特定的问题添加解决方案,但是我会根据我的一个工作示例告诉我应该做什么。所以这不是在BroadcastReceiver中检索值的方法。当使用intent时,我们需要使用put命令来保存一个变量。

在这里,在一个活动我设置的重复报警有三个变量:

int REQUEST_CODE = (int) (cal_now.getTimeInMillis()/1000); 
    Intent intent = new Intent(NewSchedule.this, RepeatingAlarm.class); 
    intent.putExtra("endTime", cal_alarmend.getTimeInMillis()/1000); 
    intent.putExtra("reqCode", REQUEST_CODE); 
    intent.putExtra("startTime", cal_alarmstart.getTimeInMillis()/1000); 
    PendingIntent sender = PendingIntent.getBroadcast(NewSchedule.this, REQUEST_CODE, intent, 0); 
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal_alarmstart.getTimeInMillis(), 6000, sender); 

在我使用的捆绑的BroadcastReceiver类的的onReceive()方法检索的值:

public class RepeatingAlarm extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

     Bundle b = intent.getExtras(); 
     long end = b.getLong("endTime") * 1000; 
     int rc = b.getInt("reqCode"); 
     long start = b.getLong("startTime") * 1000; 
     Log.i("rc", rc + ""); 
     Log.i("now", now + ""); 
     Log.i("start", start + ""); 

     } 
    }