在特定时间(闹钟)启动我的Phonegap应用程序

时间:2012-07-07 11:15:22

标签: java android alarmmanager phonegap-plugins

好的,所以我试图让我的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个错误:

  1. AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);原因:

      

    ALARM_SERVICE无法解析为变量alarm.java

  2. Intent intent = new Intent(ctx, AlarmReciever.class);原因:

      

    构造函数Intent(CordovaInterface,Class)是未定义的alarm.java

  3. PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);原因:

      

    PendingIntent类型中的方法getBroadcast(Context,int,Intent,int)不适用于参数(alarm,int,Intent,int)alarm.java`

  4. 我的接收器Java文件名为AlarmReciever.java

    如果有人看到我做错了什么,那么我会很感激帮助。

3 个答案:

答案 0 :(得分:4)

像@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>

除了BroadcastReceiver之外,如果AlarmReceiver是一个Activity,你可以使用:

PendingIntent sender = PendingIntent.getActivity(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);

直接启动您的活动。

答案 1 :(得分:2)

您用于警报服务的代码旨在用于上下文中。 你应该得到上下文(可能使用类似的东西:     Context ctx = cordova.getActivity()。getApplicationContext()。 )

然后在1上,使用ctx.getSystemService,在3而不是传递它,传递ctx,而不是ALARM_SERVICE,写上下文.ALARM_SERVICE。

答案 2 :(得分:-1)

您可以使用后台服务来执行此操作,后台服务将在特定时间启动应用程序。