2010-12-16 132 views
255

我想在我的項目中實現計劃功能。所以我搜索了一個鬧鐘管理器程序,但我找不到任何例子。報警管理器示例

任何人都可以幫助我一個基本的報警管理程序?

+13

你沒有檢查API演示,對不對? – EboMike 2010-12-16 09:13:00

+2

[鏈接](https://github.com/rakeshcusat/Code4Reference/tree/master/AndroidProjects/AlarmManagerExample)此鏈接適用於4.0測試版 – shareef 2013-01-03 06:51:21

回答

380

這是工作代碼。它每10分鐘喚醒一次CPU,直到電話關閉。

加入的Manifest.xml:

... 
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 
... 
<receiver android:process=":remote" android:name=".Alarm"></receiver> 
... 

代碼在你的類:

package yourPackage; 
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); 
    } 
} 

設置報警從服務:

package yourPackage; 

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.IBinder; 

public class YourService extends Service 
{ 
    Alarm alarm = new Alarm(); 
    public void onCreate() 
    { 
     super.onCreate();  
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     alarm.setAlarm(this); 
     return START_STICKY; 
    } 

    @Override   
    public void onStart(Intent intent, int startId) 
    { 
     alarm.setAlarm(this); 
    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 
} 

如果你想設置報警在pho重複NE開機時間:

添加權限和服務的Manifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> 
... 
<receiver android:name=".AutoStart"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
    </intent-filter> 
</receiver> 
... 
<service 
     android:name=".YourService" 
     android:enabled="true" 
     android:process=":your_service" > 
</service> 

,並創造新的類:

package yourPackage; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class AutoStart extends BroadcastReceiver 
{ 
    Alarm alarm = new Alarm(); 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
     { 
      alarm.setAlarm(context); 
     } 
    } 
} 
+3

如何調用此setAlarm方法。如果我想從服務類中調用它?它是否被自動調用? – 2012-01-20 04:26:21

+1

alarm.StartAlarm(context);什麼是上下文以及如何初始化它? – 2012-01-20 12:08:09

+0

是的,我得到了它的感謝! – 2012-01-20 12:44:09

21

這是一個相當自足的例子。 5秒後它會變成紅色。

public void SetAlarm() 
    { 
     final Button button = buttons[2]; // replace with a button from your own UI 
     BroadcastReceiver receiver = new BroadcastReceiver() { 
      @Override public void onReceive(Context context, Intent _) 
      { 
       button.setBackgroundColor(Color.RED); 
       context.unregisterReceiver(this); // this == BroadcastReceiver, not Activity 
      } 
     }; 

     this.registerReceiver(receiver, new IntentFilter("com.blah.blah.somemessage")); 

     PendingIntent pintent = PendingIntent.getBroadcast(this, 0, new Intent("com.blah.blah.somemessage"), 0); 
     AlarmManager manager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE)); 

     // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime()) 
     manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*5, pintent); 
    } 

請記住,即使應用程序未運行,AlarmManager也會觸發。如果您調用此功能並點擊主頁按鈕,請等待5秒鐘,然後返回到您的應用程序,該按鈕將變爲紅色。

我不知道如果你的應用根本不在內存中,你會得到什麼樣的行爲,所以要小心你試圖保存的是什麼樣的狀態。

+13

你應該發佈該班的所有代碼,以查看所需的進口並延伸 – shareef 2013-01-02 09:24:08

+4

crtl + shft + o或命令+ shft + o – 2014-01-30 14:41:59

+0

如何設置爲每24小時重複一次? – seekingStillness 2017-10-03 18:44:37

20

你可以看到這個例子與重複功能 GitHub link提醒此鏈接爲4.0測試

enter image description here

+0

intent.putExtra(「onetime」,Boolean.True);拯救我的生命<3 – Bawa 2017-04-12 20:00:06

47

我試圖從XXX的解決方案,它雖然一開始工作,在某個時候停止工作。 onReceive從來沒有再被召喚。我花了數小時試圖弄清楚它可能是什麼。我開始意識到,無論出於什麼神祕原因,Intent不再被稱爲。爲了解決這個問題,我發現你確實需要在清單中爲接收者指定一個動作。例如:

<receiver android:name=".Alarm" android:exported="true"> 
    <intent-filter> 
     <action android:name="mypackage.START_ALARM" > 
     </action> 
    </intent-filter> 
</receiver> 

請注意名稱是".Alarm"與句點。在XXX的setAlarm方法,創建Intent如下:

Intent i = new Intent("mypackage.START_ALARM"); 

START_ALARM消息可以是你希望它是什麼。爲了演示目的,我給了它這個名字。

我沒有看到清單中定義的接收者沒有指定動作的意圖過濾器。按照XXX指定的方式創建它們似乎有點虛假。通過指定操作名稱,Android將被迫使用與操作對應的類創建BroadcastReceiver的實例。如果您依賴上下文,請注意Android有幾個不同的對象,都稱爲上下文,並且可能不會導致您創建BroadcastReceiver。強制Android僅使用操作消息來創建類的實例要比依賴某些可能無法工作的iffy上下文要好得多。

+1

@AndroidDev根據PendingIntent。getBroadcast'文檔,「出於安全原因,您在此提供的Intent應該幾乎總是一個明確的意圖,即指定通過Intent.setClass'傳遞給顯式組件。 – aandis 2015-07-27 16:01:08

+1

無論文件說什麼,這應該是被接受的答案,因爲它實際上與接受的答案相反。 – m0skit0 2017-06-01 16:02:29

2

此代碼將幫助您發出重複報警。重複時間可由您設定。

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#000000" 
    android:paddingTop="100dp"> 

    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" > 

    <EditText 
     android:id="@+id/ethr" 
    android:layout_width="50dp" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:hint="Hr" 
    android:singleLine="true" > 


     <requestFocus /> 
    </EditText> 

    <EditText 
     android:id="@+id/etmin" 
    android:layout_width="55dp" 
    android:layout_height="wrap_content" 

    android:ems="10" 
    android:hint="Min" 
    android:singleLine="true" /> 

    <EditText 
     android:id="@+id/etsec" 
    android:layout_width="50dp" 
    android:layout_height="wrap_content" 

    android:ems="10" 
    android:hint="Sec" 
    android:singleLine="true" /> 

    </LinearLayout> 

    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:paddingTop="10dp"> 


    <Button 
     android:id="@+id/setAlarm" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onClickSetAlarm" 
     android:text="Set Alarm" /> 

</LinearLayout> 

</LinearLayout> 

MainActivity.java

public class MainActivity extends Activity { 
    int hr = 0; 
    int min = 0; 
    int sec = 0; 
    int result = 1; 

    AlarmManager alarmManager; 
    PendingIntent pendingIntent; 
    BroadcastReceiver mReceiver; 

    EditText ethr; 
    EditText etmin; 
    EditText etsec; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ethr = (EditText) findViewById(R.id.ethr); 
     etmin = (EditText) findViewById(R.id.etmin); 
     etsec = (EditText) findViewById(R.id.etsec); 
     RegisterAlarmBroadcast(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    protected void onDestroy() { 
     unregisterReceiver(mReceiver); 
     super.onDestroy(); 
    } 

    public void onClickSetAlarm(View v) { 
     String shr = ethr.getText().toString(); 
     String smin = etmin.getText().toString(); 
     String ssec = etsec.getText().toString(); 

     if(shr.equals("")) 
      hr = 0; 
     else { 
      hr = Integer.parseInt(ethr.getText().toString()); 
      hr=hr*60*60*1000; 
     } 

     if(smin.equals("")) 
      min = 0; 
     else { 
      min = Integer.parseInt(etmin.getText().toString()); 
      min = min*60*1000; 
     } 

     if(ssec.equals("")) 
      sec = 0; 
     else { 
      sec = Integer.parseInt(etsec.getText().toString()); 
      sec = sec * 1000; 
     } 
     result = hr+min+sec; 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent); 
    } 

    private void RegisterAlarmBroadcast() { 
     mReceiver = new BroadcastReceiver() { 
      // private static final String TAG = "Alarm Example Receiver"; 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       Toast.makeText(context, "Alarm time has been reached", Toast.LENGTH_LONG).show(); 
      } 
     }; 

     registerReceiver(mReceiver, new IntentFilter("sample")); 
     pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("sample"), 0); 
     alarmManager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE)); 
    } 

    private void UnregisterAlarmBroadcast() { 
     alarmManager.cancel(pendingIntent); 
     getBaseContext().unregisterReceiver(mReceiver); 
    } 
} 

如果你只需要一個單一時間報警,然後

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent); 

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + result , pendingIntent); 
更換
2

我已盡我最大的努力做到了這一點。

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 

import junit.framework.Assert; 

/** 
* Created by Daniel on 28/08/2016. 
*/ 
public abstract class AbstractSystemServiceTask { 

    private final Context context; 
    private final AlarmManager alarmManager; 
    private final BroadcastReceiver broadcastReceiver; 
    private final PendingIntent pendingIntent; 

    public AbstractSystemServiceTask(final Context context, final String id, final long time, final AlarmType alarmType, final BackgroundTaskListener backgroundTaskListener) { 

     Assert.assertNotNull("ApplicationContext can't be null", context); 
     Assert.assertNotNull("ID can't be null", id); 

     this.context = context; 

     this.alarmManager = (AlarmManager) this.context.getSystemService(Context.ALARM_SERVICE); 

     this.context.registerReceiver(
       this.broadcastReceiver = this.getBroadcastReceiver(backgroundTaskListener), 
       new IntentFilter(id)); 

     this.configAlarmManager(
       this.pendingIntent = PendingIntent.getBroadcast(this.context, 0, new Intent(id), 0), 
       time, 
       alarmType); 
    } 

    public void stop() { 

     this.alarmManager.cancel(this.pendingIntent); 
     this.context.unregisterReceiver(this.broadcastReceiver); 
    } 

    private BroadcastReceiver getBroadcastReceiver(final BackgroundTaskListener backgroundTaskListener) { 

     Assert.assertNotNull("BackgroundTaskListener can't be null.", backgroundTaskListener); 

     return new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 

       backgroundTaskListener.perform(context, intent); 
      } 
     }; 
    } 

    private void configAlarmManager(final PendingIntent pendingIntent, final long time, final AlarmType alarmType) { 

     long ensurePositiveTime = Math.max(time, 0L); 

     switch (alarmType) { 
      case REPEAT: 
       this.alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), ensurePositiveTime, pendingIntent); 
       break; 
      case ONE_TIME: 
      default: 
       this.alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ensurePositiveTime, pendingIntent); 
     } 
    } 

    public interface BackgroundTaskListener { 

     void perform(Context context, Intent intent); 

    } 

    public enum AlarmType { 

     REPEAT, ONE_TIME; 

    } 

} 

唯一的下一步,實現它。

import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

import ...AbstractSystemServiceTask; 

import java.util.concurrent.TimeUnit; 

/** 
* Created by Daniel on 28/08/2016. 
*/ 
public class UpdateInfoSystemServiceTask extends AbstractSystemServiceTask { 

    private final static String ID = "UPDATE_INFO_SYSTEM_SERVICE"; 
    private final static long REPEAT_TIME = TimeUnit.SECONDS.toMillis(10); 
    private final static AlarmType ALARM_TYPE = AlarmType.REPEAT; 

    public UpdateInfoSystemServiceTask(Context context) { 

     super(context, ID, REPEAT_TIME, ALARM_TYPE, new BackgroundTaskListener() { 

      @Override 
      public void perform(Context context, Intent intent) { 

       Log.i("MyAppLog", "-----> UpdateInfoSystemServiceTask"); 

       //DO HERE WHATEVER YOU WANT... 
      } 
     }); 

     Log.i("MyAppLog", "UpdateInfoSystemServiceTask started."); 
    } 

} 

我喜歡這個實現的工作,但另一種可能的好方法,它不使AbstractSystemServiceTask抽象類,並通過生成器生成它。

我希望它能幫助你。

修訂 改進,允許幾個BackgroundTaskListener在同一BroadCastReceiver

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 

import junit.framework.Assert; 

import java.util.HashSet; 
import java.util.Set; 

/** 
* Created by Daniel on 28/08/2016. 
*/ 
public abstract class AbstractSystemServiceTask { 

    private final Context context; 
    private final AlarmManager alarmManager; 
    private final BroadcastReceiver broadcastReceiver; 
    private final PendingIntent pendingIntent; 

    private final Set<BackgroundTaskListener> backgroundTaskListenerSet; 

    public AbstractSystemServiceTask(final Context context, final String id, final long time, final AlarmType alarmType) { 

     Assert.assertNotNull("ApplicationContext can't be null", context); 
     Assert.assertNotNull("ID can't be null", id); 

     this.backgroundTaskListenerSet = new HashSet<>(); 

     this.context = context; 

     this.alarmManager = (AlarmManager) this.context.getSystemService(Context.ALARM_SERVICE); 

     this.context.registerReceiver(
       this.broadcastReceiver = this.getBroadcastReceiver(), 
       new IntentFilter(id)); 

     this.configAlarmManager(
       this.pendingIntent = PendingIntent.getBroadcast(this.context, 0, new Intent(id), 0), 
       time, 
       alarmType); 
    } 

    public synchronized void registerTask(final BackgroundTaskListener backgroundTaskListener) { 

     Assert.assertNotNull("BackgroundTaskListener can't be null", backgroundTaskListener); 

     this.backgroundTaskListenerSet.add(backgroundTaskListener); 
    } 

    public synchronized void removeTask(final BackgroundTaskListener backgroundTaskListener) { 

     Assert.assertNotNull("BackgroundTaskListener can't be null", backgroundTaskListener); 

     this.backgroundTaskListenerSet.remove(backgroundTaskListener); 
    } 

    public void stop() { 

     this.backgroundTaskListenerSet.clear(); 

     this.alarmManager.cancel(this.pendingIntent); 
     this.context.unregisterReceiver(this.broadcastReceiver); 
    } 

    private BroadcastReceiver getBroadcastReceiver() { 

     return new BroadcastReceiver() { 

      @Override 
      public void onReceive(final Context context, final Intent intent) { 

       for (BackgroundTaskListener backgroundTaskListener : AbstractSystemServiceTask.this.backgroundTaskListenerSet) { 

        backgroundTaskListener.perform(context, intent); 
       } 
      } 
     }; 
    } 

    private void configAlarmManager(final PendingIntent pendingIntent, final long time, final AlarmType alarmType) { 

     long ensurePositiveTime = Math.max(time, 0L); 

     switch (alarmType) { 
      case REPEAT: 
       this.alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), ensurePositiveTime, pendingIntent); 
       break; 
      case ONE_TIME: 
      default: 
       this.alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ensurePositiveTime, pendingIntent); 
     } 
    } 

    public interface BackgroundTaskListener { 

     void perform(Context context, Intent intent); 

    } 

    public enum AlarmType { 

     REPEAT, ONE_TIME; 

    } 

} 
3

MainActivity.java

package com.example.alarmexample; 

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
Button b1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     startAlert(); 

} public void startAlert() { 
     int timeInSec = 2; 

     Intent intent = new Intent(this, MyBroadcastReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast( 
             this.getApplicationContext(), 234, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (timeInSec * 1000), pendingIntent); 
     Toast.makeText(this, "Alarm set to after " + i + " seconds",Toast.LENGTH_LONG).show(); 
    } 

} 

MyBroadcastReceiver.java

package com.example.alarmexample; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.widget.Toast; 

public class MyBroadcastReceiver extends BroadcastReceiver { 
    MediaPlayer mp; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     mp=MediaPlayer.create(context, R.raw.alarm); 
     mp.start(); 
     Toast.makeText(context, "Alarm", Toast.LENGTH_LONG).show(); 
    } 
} 

AndroidManifest.xml中

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

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

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


    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.alarmexample.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver android:name="MyBroadcastReceiver" > 
     </receiver> 
    </application> 

</manifest>