如何在后台没有任何活动的情况下弹出警报消息?

Posted

技术标签:

【中文标题】如何在后台没有任何活动的情况下弹出警报消息?【英文标题】:How to popup Alarm Message without any activity in background? 【发布时间】:2012-05-23 12:44:15 【问题描述】:

在我的 android i 应用程序中,我可以使用警报功能和注销功能。设置闹钟时间后,我将通过单击注销按钮退出应用程序。

我正在使用

         ExitActivity.this.finish();  
         Intent intent1 = new Intent(ExitActivity.this,PinActivity.class);  
         intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
         startActivity(intent1);  

         Intent intent = new Intent(Intent.ACTION_MAIN); 
         intent.addCategory(Intent.CATEGORY_HOME);  
         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(intent); 

此代码退出应用程序,进入主屏幕,然后启动主屏幕。这是因为当我回到我的应用程序时,它会启动 pinscreen。警报完全符合我的要求,但是在弹出警报消息时,它在后台具有 pinactivity(我不想要)。我不想摆脱后台的 pin 活动。

这是我的接收器类?

     public class ShortTimeEntryReceiver extends BroadcastReceiver

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

    Toast.makeText(context,"Alarm Working", Toast.LENGTH_SHORT).show();

     try 
         Bundle bundle = intent.getExtras();
         String message = bundle.getString("alarm_message");

         Intent newIntent = new Intent(context, ReminderPopupMessage.class);
         newIntent.putExtra("alarm_message", message);
         newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(newIntent);
         catch (Exception e) 
         Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
         e.printStackTrace();

        

我该怎么做? 谢谢你们的帮助。。

【问题讨论】:

【参考方案1】:

您应该使用警报管理器在 Android 中设置警报。警报管理器保留您的警报并在警报时间触发未决意图。

首先像这样创建一个待处理的意图:

 pendingIntent = PendingIntent.getService(CONTEXT, ALARM_ID,  INTENT_TO_LAUNCH, 0);

然后使用这个待处理的意图来设置这样的警报:

 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
 alarmManager.set(AlarmManager.RTC_WAKEUP, ALARM_TIME, pendingIntent);

这将在给定时间启动待定意图。

要删除警报,您必须使用相同的 ALARM_ID 重新创建相同的 Pending Intent:

 alarmManager.cancel(pendingIntent);

【讨论】:

实际上我已经做到了。这就是我现在正在做的,但问题是当警报弹出消息我看到最后使用的背景屏幕时,我不需要... 那你为什么不在警报弹出时完成你的pin活动呢? 那是什么问题..是否可以从另一个活动中关闭活动.. 是的,这是可能的。只需使用您要关闭的活动的上下文并在任何您想要的地方调用 finish() 方法:ACTIVITY_CONTEXT.finish() 感谢您的评论。抱歉,我对获取 Activity 的上下文一无所知。请您帮帮我【参考方案2】:

首先像这样创建一个待处理的意图:

 pendingIntent = PendingIntent.getService(context, alarm_id, Pass your data with intent,  PendingIntent.FLAG_UPDATE_CURRENT);

这样设置闹钟:

 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
        //19 4.4and above api level
        am.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + AlarmManager.INTERVAL_DAY, sender);
  else 
        //below 19 4.4
        am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + AlarmManager.INTERVAL_DAY, sender);
 

这将在给定时间启动待定意图。

要删除警报,您必须使用相同的待处理意图和相同的ALARM_ID

am.cancel(pendingIntent);

现在您需要创建一项服务来捕捉警报。

【讨论】:

以上是关于如何在后台没有任何活动的情况下弹出警报消息?的主要内容,如果未能解决你的问题,请参考以下文章

在异常情况下发出警报

GCM 如何检测应用程序是不是打开,如果是,则弹出警报框,而不是正常的通知流程?

在没有重定向的 Rails 控制器中发出警报

收到推送通知且应用程序在前台时如何防止弹出警报

如何验证用户是不是具有网络访问权限并在没有网络访问权限时显示弹出警报

Appium - 弹出警报消息没有被解雇