我正在使用基于警报的应用程序,已使用以下代码设置了警报。如果创建警报,则表示警报已创建,但警报并未移至广播接收器。我尝试了几次,但对我不起作用。即使我已在Android清单文件中正确添加了广播接收器。
1。设置警报等级:
public class Alertedit extends Activity {
boolean AlarmEnabled;
final static int RQS_1 = 1;
TimePicker myTimePicker;
private SQLiteConnectornew loginDataBaseAdapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alertaddlist);
Button bt1 = (Button) findViewById(R.id.alerttime);
bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
openTimePickerDialog(false);
}});}
private void openTimePickerDialog(boolean is24r){
Calendar calendar = Calendar.getInstance();
timePickerDialog = new TimePickerDialog(
Alertedit.this,
onTimeSetListener,
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
is24r);
timePickerDialog.setTitle("Set Alarm Time");
timePickerDialog.show();}
OnTimeSetListener onTimeSetListener
= new OnTimeSetListener(){
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Calendar calNow = Calendar.getInstance();
Calendar calSet = (Calendar) calNow.clone();
calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
calSet.set(Calendar.MINUTE, minute);
calSet.set(Calendar.SECOND, 0);
calSet.set(Calendar.MILLISECOND, 0);
if(calSet.compareTo(calNow) <= 0){
//Today Set time passed, count to tomorrow
calSet.add(Calendar.DATE, 1);
}
setAlarm(calSet);
}
private void setAlarm(Calendar targetCal) {
// TODO Auto-generated method stub
bt1.setText("" + targetCal.getTime());
Log.d("set", "Alarm set");
Intent intent = new Intent(Alertedit.this, AlarmReciever.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(Alertedit.this, RQS_1, intent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
}};
2.Receiver类:
public class AlarmReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
/* Display an alert */
Log.e("value", "how are you??");
Toast.makeText(context, "How are you?", Toast.LENGTH_LONG).show();
}
catch (Exception r) {
Toast.makeText(context, "You were supposed to do something"
+" now but I can't retrieve what it was.",
Toast.LENGTH_SHORT).show();
Log.e("ALARM_RECEIVER", r.toString());
}
}
}
3。清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.contactlist"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.contactlist.Primemfrontpage"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<activity
android:name="com.example.contactlist.Login"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.example.contactlist.Registration"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.example.contactlistnew.Alertedit"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>
<receiver android:name="com.example.contactlistnew.AlarmReceiver">
</receiver></application></manifest>
似乎您应该为接收方添加意图过滤器,如下所示
<receiver android:name="com.example.contactlistnew.AlarmReceiver">
<intent-filter>
<action android:name="android.alarm.demo.action" />
</intent-filter>
</receiver>
从BroadcastReceiver必须从您的Intent中读取消息,类似这样
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// Extract data included in the Intent
CharSequence intentData = intent.getCharSequenceExtra("message");
Toast.makeText(context, "Received the Intent's message: "+intentData, Toast.LENGTH_LONG).show();
}
}
这对我有用。请检查时间,将时间从当前时间提前2分钟。
public static final int REQUEST_CODE_RESTART_TIMER_TASK = 874378;
private void registerAlarm(Context applicationContext, int minute) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, minute);
PendingIntent pendingIntent = getAlarmPendingIntent(applicationContext);
AlarmManager alarmMgr1 = (AlarmManager) applicationContext.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmMgr1.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmMgr1.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmMgr1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
这是您如何创建待处理的意图
private PendingIntent getAlarmPendingIntent(Context context) {
Intent intents = new Intent(context, ServiceRestartReceiver.class);
intents.setAction(ServiceRestartReceiver.ACTION_TIMER_TASK);
return PendingIntent.getBroadcast(context, REQUEST_CODE_RESTART_TIMER_TASK,
intents, PendingIntent.FLAG_UPDATE_CURRENT);
}
这是您取消此警报的方式
private void cancelAlarm(Context context) {
PendingIntent pendingIntent = getAlarmPendingIntent(context);
AlarmManager alarmMgr1 = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmMgr1.cancel(pendingIntent);
}
广播接收器类似
public class ServiceRestartReceiver extends BroadcastReceiver {
public static final String ACTION_TIMER_TASK = "com.tracki.action.COUNTDOWN_TIMER";
private static final String TAG = "ServiceRestartReceiver";
@Override
public void onReceive(Context context, Intent intent) {
try {
if (intent != null && intent.getAction() != null) {
switch (intent.getAction()) {
case ACTION_TIMER_TASK:
// DO your stuff here
break;
}
}
} catch (Exception e) {
Log.e(TAG, "Exception occur inside ServiceRestartReceiver:onReceive(): " + e.getMessage());
}
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.contactlist"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.contactlist.Primemfrontpage"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<activity
android:name="com.example.contactlist.Login"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.example.contactlist.Registration"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.example.contactlistnew.Alertedit"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>
<receiver
android:name=".ServiceRestartReceiver"
android:exported="false" />
</application>
</manifest>