【问题标题】:Start my Phonegap App at a specific Time (Alarm Clock)在特定时间启动我的 Phonegap 应用程序(闹钟)
【发布时间】:2012-07-07 11:15:21
【问题描述】:

好的,所以我正在尝试让我的 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) 是 undefined 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`

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

如果有人发现我做错了什么,我将不胜感激。

【问题讨论】:

  • 我正在尝试做类似的事情,我在phonegap闹钟上搜索并找到了一个插件。显然它不适用于 iOS。
  • 要获取ctx(上下文),您可以使用cordova.getActivity().getApplicationContext();this tutorial 也可以帮助你。

标签: java android alarmmanager phonegap-plugins


【解决方案1】:

就像@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 类。它应该是扩展广播接收器:

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);

直接启动您的 Activity。

【讨论】:

    【解决方案2】:

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

    然后在 1 中,使用 ctx.getSystemService,在 3 中,而不是传递 this,传递 ctx,而不是 ALARM_SERVICE,而是写 Context.ALARM_SERVICE。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 2012-08-15
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多