2012-02-21 74 views
2

本教程来自android-er, 主要活动(AndroidScheduledActivity.java)启动一个AlarmManager来重复触发BroadcastReceiver(MyScheduledReceiver.java)。在MyScheduledReceiver的onReceive()方法中,它间接启动另一个活动(MyScheduledActivity.java)。这样活动(MyScheduledActivity.java)将按计划的时间间隔开始。 现在我将使用AutoStart自动启动,但我无法写入AutoStartNotifyReceiver。 请你能给我一个想法如何管理它? 非常感谢!如何自动启动AlarmManager以启动预定活动?

主要活动,AndroidScheduledActivity.java:

public class AndroidScheduledActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button buttonStart = (Button)findViewById(R.id.start); 
     buttonStart.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View arg0) { 
    Intent myIntent = new Intent(getBaseContext(), 
     MyScheduledReceiver.class); 

    PendingIntent pendingIntent 
    = PendingIntent.getBroadcast(getBaseContext(), 
     0, myIntent, 0); 

    AlarmManager alarmManager 
     = (AlarmManager)getSystemService(ALARM_SERVICE); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 10); 
    long interval = 60 * 1000; // 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
     calendar.getTimeInMillis(), interval, pendingIntent); 
    finish(); 
    }}); 
    } 

} 

然后广播接收器,MyScheduledReceiver.java

public class MyScheduledReceiver extends BroadcastReceiver { 

public void onReceive(Context context, Intent intent) { 

Intent scheduledIntent = new Intent(context, MyScheduledActivity.class); 
scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(scheduledIntent); 
} 
} 

和我的问题AutoStartNotifyReceiver:

public class AutoStartNotifyReceiver extends BroadcastReceiver { 

private final String BOOT_COMPLETED_ACTION = "android.intent.action.BOOT_COMPLETED"; 

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

    if(intent.getAction().equals(BOOT_COMPLETED_ACTION)){ 

???????????????????? 

    } 

} 
} 

回答

5

AutoStartNotifyReceiver extends BroadcastReceiver类是存在的,因为设备重置时,警报会被清除。因此,在该课程的onReceive(您有问号)中,您需要重新设置警报,并使用onClick方法中第一次使用相同的代码(当然,不包括finish()AndroidScheduledActivity

然后,你需要把下面的项在您的Manifest,让系统知道要启动您AutoStartNotifyReceiver在系统启动时达:

<receiver android:name=".AutoStartNotifyReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filter> 
</receiver> 

除了在Manifest权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

现在,这是假设你只有一个警报,并且每次只设置一个方向。如果情况并非如此,则会变得更复杂一些。但根据你提供的信息,我的解决方案应该做你想做的。

此外,由于您是新来者,因此您只需提醒一下:当某人提供问题的适当答案时,提问者(您)通过点击答案旁边的复选框接受答案。这是回答人的信用。欢迎来到SO!

1

谢谢,它的工作原理。只需要改进我的Java多一点。我必须添加“背景”,不知道为什么。

public class AutoStartNotifyReceiver extends BroadcastReceiver { 
    private final String BOOT_COMPLETED_ACTION = "android.intent.action.BOOT_COMPLETED"; 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(BOOT_COMPLETED_ACTION)){ 

      Intent myIntent = new Intent(context, MyScheduledReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0); 

      AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      calendar.add(Calendar.SECOND, 10); 
      long interval = 60 * 1000; 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), interval, pendingIntent);   
     } 
    } 
}