【问题标题】:Alarm Manager BroadcastReceiver, setRepeating isn't working when called from inside a Fragment警报管理器广播接收器,从片段内部调用时 setRepeating 不起作用
【发布时间】:2014-01-20 13:39:18
【问题描述】:

大家好,这是我在这里的第一篇文章,我必须说我真的很喜欢这个网站,它帮助我解决了很多问题。但是现在我在从 Fragment 内部使用 android 中的警报管理器时遇到了这个问题。

这是我的代码(来自 stackoverflow 的 sn-p),它曾经可以正常工作,我试图将分钟设置为随机,然后它突然停止工作。当我删除它时,错误仍然存​​在..

Alarm.java:

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;

public class Alarm extends BroadcastReceiver 
{    
     @Override
     public void onReceive(Context context, Intent intent) 
     {   
         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
         wl.acquire();

         // Put here YOUR code.
         Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

         wl.release();
     }

 public void SetAlarm(Context context)
 {
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent i = new Intent(context, Alarm.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
 }

 public void CancelAlarm(Context context)
 {
     Intent intent = new Intent(context, Alarm.class);
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
     alarmManager.cancel(sender);
 }
}

RealityCheck.java

import com.actionbarsherlock.app.SherlockFragment;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.*;
import android.widget.CheckBox;
import android.widget.Toast;

public class RealityCheck extends SherlockFragment implements View.OnClickListener {

    CheckBox EnabledBox;
    Alarm alarm = new Alarm();
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        //Moet inflater gebruiken om findViewById in een Fragment te gebruiken en op het einde returnen
        View rootView = inflater.inflate(R.layout.activity_reality_check, container, false);
        EnabledBox = (CheckBox)rootView.findViewById(R.id.check_box_enabled);
        EnabledBox.setOnClickListener(this);
        return rootView;

    }
    @Override
    public void onClick(View v) {
        CheckBox EnabledBox = (CheckBox) v;
        if(EnabledBox.isChecked())
        {
            //Moet this.getActivity gebruiken in Fragment
            Toast.makeText(RealityCheck.this.getActivity(), "Reality check alarm activated", Toast.LENGTH_SHORT).show();
            //Alarm starten (in fragment weer getActivity() ipv Context)
            alarm.SetAlarm(getActivity());
            }
        else
        {
            Toast.makeText(RealityCheck.this.getActivity(), "Reality check alarm disabled", Toast.LENGTH_SHORT).show();
            alarm.CancelAlarm(getActivity());
        }   

    }   
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dreamincubation"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Sherlock" >

        <receiver  
            android:process=":remote" android:name="Alarm"></receiver>

        <activity
            android:name="com.example.dreamincubation.IntroWindow"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.dreamincubation.MainActivity"
            android:label="@string/title_activity_main_menu" >
        </activity>
        <activity
            android:name="com.example.dreamincubation.RealityCheck"
            android:label="@string/title_activity_reality_check" >
        </activity>
        <activity
            android:name="com.example.dreamincubation.IncubationInfo"
            android:label="@string/title_activity_incubation_info" >
        </activity>
        <activity
            android:name="com.example.dreamincubation.Incubation"
            android:label="@string/title_activity_incubation" >
        </activity>
        <activity
            android:name="com.example.dreamincubation.AlarmService"
            android:label="@string/title_activity_alarm_service" >
        </activity>
         <receiver android:name="Alarm" >
        </receiver>
    </application>
</manifest>

我试过没有唤醒锁。也没用。

如果有人可以帮助我,将不胜感激..

【问题讨论】:

  • 您也可以发布您的清单吗?
  • 请解释它是如何不工作的。
  • 已添加清单。它立即显示吐司,而不是等待设定的时间。我觉得很奇怪,这在几个小时前有效,现在不再有效了..

标签: java android broadcastreceiver alarmmanager


【解决方案1】:

您是在告诉 AlarmManager 通过这样做立即触发:

 am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); 

它应该每 10 分钟重复一次警报。

但如果您希望第一个事件在 10 分钟内完成并每 10 分钟重复一次,您必须这样做:

 long tenMin = 1000 * 60 * 10;
 am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + tenMin, tenMin, pi); 

我建议在 Service 中处理 AlarmManager,一个很棒的教程解释了它:

https://web.archive.org/web/20150626092455/http://blog.blundell-apps.com/notification-for-a-user-chosen-time[archive.org]

如果你不需要准确的时间闹钟,你一定要使用这个方法:

setInexactRepeating

http://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int, long, long, android.app.PendingIntent)

我命令保存电池。

【讨论】:

  • 大佬,成功了!你推荐做一个这样的闹钟吗?或者从服务中调用它会更好吗? (我刚开始使用 android 开发,我只有一些基本的 Java 知识,因此可能会出现愚蠢的问题。)
  • 我编辑了我的答案。处理它的最佳方法是使用服务。但是,如果您只是在您的应用程序中设置了一次警报并且不要使用它。它不会杀了你。
  • 好的,谢谢,它应该是一个以随机间隔(1 到 3 小时之间)触发的闹钟,让我进行现实检查。那么我会更好地提供服务还是这样会更好?在您将应用程序从 ram/turn 手机中清除后,服务是否保持活动状态?
  • 你应该使用一个服务,该服务将只用于设置和取消警报事件。因此,即使它被系统杀死,您也会收到该事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
相关资源
最近更新 更多