2015-11-03 64 views
3

我正在创建一个也具有闹钟功能的应用程序。它可以像我期望的那样工作。但只有当应用程序正在运行。如果我使用任务管理器关闭应用程序,则警报永不响。这是否意味着我必须创建一项服务?如果您使用BroadCast Receiver使用Alarm Manager,即使应用程序未在手机中运行,我也已经读过,您不需要服务。如果我错了,请纠正我。当应用程序关闭时运行报警

MainActivity

public class MainActivity extends Activity { 
private AlarmManager manager; 
private PendingIntent intent; 
private AlarmManagerHelper alarm; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    alarm=new AlarmManagerHelper(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

public void startRepeatingTimer(View view) { 
    Context context = this.getApplicationContext(); 
    if(alarm != null){ 
     alarm.setAlarms(context); 
    }else{ 
     Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show(); 
    } 
} 

public void cancelRepeatingTimer(View view){ 
    Context context = this.getApplicationContext(); 
    if(alarm != null){ 
     alarm.CancelAlarm(context); 
    }else{ 
     Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show(); 

    } 
} 

public void onetimeTimer(View view){ 

    Toast.makeText(this,"hello one time",Toast.LENGTH_SHORT).show(); 
    Context context = this.getApplicationContext(); 
    if(alarm != null){ 
     alarm.setOnetimeTimer(context); 
    }else{ 
     Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show(); 
    } 
} 




} 

AlarmManager.java

public class AlarmManagerHelper extends BroadcastReceiver { 
final public static String ONE_TIME = "onetime"; 
@Override 
public void onReceive(Context context, Intent intent) { 

    PowerManager manager = (PowerManager)  context.getSystemService(context.POWER_SERVICE); 
    PowerManager.WakeLock wakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"mylock"); 
    wakeLock.acquire(); 

    Bundle extra = intent.getExtras(); 
    StringBuilder msgStr = new StringBuilder(); 

    if(extra!=null && extra.getBoolean(ONE_TIME, Boolean.FALSE)){ 
     msgStr.append("One time Timer : "); 
    } 

    Format formatter = new SimpleDateFormat("hh:mm:ss"); 
    msgStr.append(formatter.format(new Date())); 
    Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show(); 











    //Release the lock 
    wakeLock.release(); 




} 

public void setAlarms(Context context) { 

    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context,AlarmManagerHelper.class); 
    intent.putExtra(ONE_TIME,Boolean.FALSE); 
    PendingIntent it = PendingIntent.getBroadcast(context,0,intent,0); 
    manager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 1000 * 5 , it); 

} 

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

public void setOnetimeTimer(Context context){ 
    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context,AlarmManagerHelper.class); 
    intent.putExtra(ONE_TIME,Boolean.TRUE); 
    PendingIntent it = PendingIntent.getBroadcast(context,0,intent,0); 
    manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, it); 
} 

} 

的AndroidManifest.xml

<receiver android:name="com.example.randomlocks.alarmdemo.AlarmManagerHelper"></receiver> 
+0

使用的服务,而不是广播接收器 –

回答

0

接收机

public class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     //此处可以添加闹钟铃声 
     System.out.println("我是闹钟,我要叫醒你..."); 
     Toast.makeText(arg0, "我是闹钟,我要叫醒你...", Toast.LENGTH_SHORT).show(); 
    } 
} 

活动

package com.example.alarmmanager; 

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; 

public class MainActivity extends Activity implements OnClickListener { 

    private AlarmManager alarmManager; 
    private PendingIntent operation; 

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

     // 初始化按钮,并绑定监听事件 
     findViewById(R.id.clock).setOnClickListener(this); 
     findViewById(R.id.repeating_clock).setOnClickListener(this); 
     findViewById(R.id.cancel_clock).setOnClickListener(this); 

     // 获取AlarmManager对象 
     alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

     // 创建Intent对象,action为android.intent.action.ALARM_RECEIVER 
     Intent intent = new Intent("android.intent.action.ALARM_RECEIVER"); 
     operation = PendingIntent.getBroadcast(this, 0, intent, 0); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.clock:// 设置一次性闹钟 
        alarmManager.set(AlarmManager.RTC_WAKEUP, 10000, operation); 
        break; 
      case R.id.repeating_clock:// 设置重复闹钟 
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 5000, 10000, 
           operation); 
        break; 
      case R.id.cancel_clock:// 取消闹钟 
        alarmManager.cancel(operation); 
        break; 
      default: 
        break; 
     } 
    } 
} 

XML文件

<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" > 

    <Button 
     android:id="@+id/clock" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="设置一次性闹钟" /> 

    <Button 
     android:id="@+id/repeating_clock" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="设置重复闹钟" /> 

    <Button 
     android:id="@+id/cancel_clock" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="取消闹钟" /> 

</LinearLayout> 
+0

遗憾还是同样的问题。感谢您的意见。 – randy

+0

需要PendingIntent。 –

相关问题