好的,所以我试图让我的Phonegap应用程序在特定的时间启动,功能与闹钟相同。为此,我尝试编写自己的插件:
package de.ma;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import android.content.Intent;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.os.Bundle;
import java.util.Calendar;
import android.os.SystemClock;
import com.phonegap.api.Plugin;
public class alarm extends Plugin {
@Override
public PluginResult execute(String arg0, JSONArray arg1, String arg2) {
Calendar cal = Calendar.getInstance();
// add 5 minutes to the calendar object
cal.add(Calendar.SECOND, 5);
Intent intent = new Intent(ctx, AlarmReciever.class);
intent.putExtra("alarm_message", "O'Doyle Rules!");
// In reality, you would want to have a static variable for the request code instead of 192837
PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Get the AlarmManager service
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
return null;
}
}
但当编译时,我得到3个错误:
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
原因:ALARM_SERVICE无法解析为变量ALARM.java
Intent intent = new Intent(ctx, AlarmReciever.class);
原因:构造函数Intent(CordovaInterface,Class)未定义警报.java
PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
原因:PendingIntent类型中的方法getBroadcast(Context,int,Intent,int)不适用于参数(alarm,int,Intent,int
我的接收器Java文件名为AlarmReciever.java
。
如果有人看到我做错了什么,我会感谢你的帮助。
就像@shaish说的,首先要创建一个Context引用,这样你就可以进行Android操作:。
Context context = cordova.getActivity().getApplicationContext();
使用上下文创建Intent、创建PendingIntent和获取系统服务。
Intent intent = new Intent(context, AlarmReciever.class);
...
PendingIntent sender = PendingIntent.getBroadcast(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
...
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
另一个问题是AlarmReceiver类。它应该扩展BroadcastReceiver:
public class AlarmReceiver extends BroadcastReceiver {
private static final String LOG_TAG = AlarmReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "onReceive()");
}
}
您需要将其放入AndroidManifest.xml中:
<application>
...
<receiver android:name="de.ma.AlarmReceiver"/>
</application>
如果AlarmReceiver是一个活动,则可以使用BroadcastReceiver的替代方案:
PendingIntent sender = PendingIntent.getActivity(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
它直接启动您的"活动"。
用于报警服务的代码旨在用于上下文中。您应该获取上下文(可能使用以下内容:上下文ctx=cordova.getActivity().getApplicationContext()。)
然后在1中使用ctx.getSystemService,在3中不传递this而传递ctx,并编写Context.ALARM_SERVICE.而不是ALARM_SERVICE
您可以使用后台服务来完成此操作,后台服务将在特定时间启动应用程序。