zoukankan      html  css  js  c++  java
  • Android组件通讯之BroadcastReceiver应用闹钟服务

    此应用简单的使用了BroadcastReceiver接收一个闹钟时间传送的PendingIntent,然后通过BroadcastReceiver启动一个Activity来提示闹钟到时信息

    首先写闹钟到时信息提示的Activity:

    View Code
     1 public class AlarmMsgActivity extends Activity {
     2 
     3     @Override
     4     protected void onCreate(Bundle savedInstanceState) {
     5         super.onCreate(savedInstanceState);
     6         // 设置闹钟时间到达时跳转到此Activity弹出的Dialog
     7         new AlertDialog.Builder(AlarmMsgActivity.this)
     8         .setTitle("闹钟已经响起")
     9         .setMessage("现在时间为:" +  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))
    10         .setPositiveButton("取消", new DialogInterface.OnClickListener() {
    11             
    12             @Override
    13             public void onClick(DialogInterface dialog, int which) {
    14                 // 结束此Activity
    15                 AlarmMsgActivity.this.finish();
    16             }
    17         })
    18         .show();
    19     }
    20     
    21 }

    然后编写BroadcastReceiver:

    View Code
     1 public class AlarmReceiver extends BroadcastReceiver {
     2 
     3     @Override
     4     public void onReceive(Context context, Intent intent) {
     5         // 此广播接收者一旦接收到广播,就会跳转到AlarmMsgActivity
     6         Intent alarmIntent = new Intent(context, AlarmMsgActivity.class);
     7         // 设置跳转的Activity为一个新Task,此标记详解见http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html
     8         alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     9         context.startActivity(alarmIntent);
    10     }
    11 
    12 }

    别忘了注册两个新组件:

    <!-- 注册广播接收器 -->
            <receiver android:name=".AlarmReceiver">
                <intent-filter >
                    <action android:name="com.moka.ALARM"/>                
                </intent-filter>
            </receiver>
            <!-- 注册目的Activity -->
            <activity android:name=".AlarmMsgActivity"></activity>

    最后写设置闹钟的Activity:

    View Code
    public class MainActivity extends Activity {
        
        private TimePicker timePicker = null;
        private TextView alarmInfoText = null;
        private Button setAlarmBtn = null;
        private Button deleteAlarmBtn = null;
        
        private AlarmManager manager = null;
        // Calendar用来实现普通时间与长整形时间的格式转换
        private Calendar calendar = Calendar.getInstance();
        // 用来填充TextView
        private int hourOfday = 0;
        private int minute = 0;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            timePicker = (TimePicker) findViewById(R.id.timePicker);
            alarmInfoText = (TextView) findViewById(R.id.alarmInfoText);
            setAlarmBtn = (Button) findViewById(R.id.setAlarmBtn);
            deleteAlarmBtn = (Button) findViewById(R.id.deleteAlarmBtn);
            
            timePicker.setOnTimeChangedListener(new TimeChangedListener());
            setAlarmBtn.setOnClickListener(new SetAlarmBtnListener());
            deleteAlarmBtn.setOnClickListener(new DeleteAlarmBtnListener());
            
            // 获取系统闹钟服务
            manager = (AlarmManager) this.getSystemService(ALARM_SERVICE);
        }
        
        private class TimeChangedListener implements OnTimeChangedListener {
    
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                // TimePicker改变时,设置calendar对应值
                MainActivity.this.calendar.setTimeInMillis(System.currentTimeMillis()) ;
                MainActivity.this.calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
                MainActivity.this.calendar.set(Calendar.MINUTE, minute);
                // 注意,若此项不设置,就不会在设定的分钟数刚到就激活闹钟,而是在未来1分钟内随机触发
                MainActivity.this.calendar.set(Calendar.SECOND, 0);
                
                MainActivity.this.hourOfday = hourOfDay;
                MainActivity.this.minute = minute;
                
            }
            
        }
        
        private class SetAlarmBtnListener implements OnClickListener {
    
            @Override
            public void onClick(View v) {
                // 准备封装intent
                Intent intent = new Intent();
                intent.setAction("com.moka.ALARM");
                PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                // 第一参数:类型, 第二参数:设定的闹钟时间(长整型), 第三参数:满足时间到达条件后,处理接下来事件的PendingIntent
                manager.set(AlarmManager.RTC_WAKEUP, MainActivity.this.calendar.getTimeInMillis(), pi);
                
                MainActivity.this.alarmInfoText.setText("设定闹钟时间为:" + MainActivity.this.hourOfday + ":" + MainActivity.this.minute);
            }
            
        }
        
        private class DeleteAlarmBtnListener implements OnClickListener {
    
            @Override
            public void onClick(View v) {
                if (MainActivity.this.manager != null) {
                    // 准备封装intent
                    Intent intent = new Intent();
                    intent.setAction("com.moka.ALARM");
                    PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                    // 取消设定闹钟
                    manager.cancel(pi);
                    MainActivity.this.alarmInfoText.setText("请设定闹钟");
                }
            }
            
        }
        
    }

    效果如图:

  • 相关阅读:
    同一个类生成的对象去重
    关于公众号JavaTokings侵权声明
    消息中间件ActiveMQ使用详解
    重定向和转发的分析与理解
    Oracle SqlPlus导出查询结果
    Sql查询一个列对应多个列
    Jsp标签字典开发_基于Spring+Hibernate
    Oracle数据库导入导出简单备份
    JAVA WEB接口开发简述
    NTKO在线office控件使用实例
  • 原文地址:https://www.cnblogs.com/moka/p/3066497.html
Copyright © 2011-2022 走看看