摘要:
这一篇主要使用系统为我们提供的一个服务AlarmManager来制作一个Android小闹钟,同时还涉及到了自定义主题、判断第一次启动应用、自定义动画、对话框、制作指导滑动页面等方面。最后形成一个可以直接在手机上面使用的小闹钟。
开始启动界面AppStart.java
package com.example.alarmtest; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.widget.LinearLayout; public class AppStart extends Activity{ public static final String PACKAGE_NAME = "com.example.alarmtest"; public static final String VERSION_KEY = "versionCode"; SharedPreferences preferences; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //判断是否是首次安装 /** 判断应用首次运行 **/ preferences = getSharedPreferences("count",MODE_WORLD_READABLE); int count = preferences.getInt("start_count", 0); if(count == 0){ Editor editor = preferences.edit(); //存入数据 editor.putInt("start_count", ++count); //提交修改 editor.commit(); Intent intent = new Intent(AppStart.this, GuideActivity.class); startActivity(intent); AppStart.this.finish(); }else{ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setLayoutParams(params); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setBackgroundResource(R.drawable.main_bg_default_img_2); new Handler().postDelayed(new Runnable(){ @Override public void run(){ Intent intent = new Intent (AppStart.this, MainActivity.class); startActivity(intent); AppStart.this.finish(); } }, 1000); setContentView(linearLayout); } } }
上面使用sharedPreference中的默认设值来判断该应用是否是第一次启动,如果是第一次启动则启动GuidActivity进入指导页面,如果不是第一次启动则启动MainActivity进入主界面。
先看看GuidActivity的实现
package com.example.alarmtest; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; /** * 第一次安装引导用户的Activity * @author lixq * */ public class GuideActivity extends Activity{ private ViewPager viewPager; private ArrayList<View> pageViews; private ImageView imageView; private ImageView[] imageViews; // 包裹滑动图片LinearLayout private ViewGroup main; // 包裹小圆点的LinearLayout private ViewGroup group; //左箭头按钮 private ImageView imageViewLeft; //右箭头按钮 private ImageView imageViewRight; //当前页码 private int currentIndex; //ImageView的alpha值 private int mAlpha = 0; private boolean isHide; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //将要显示的图片放到ArrayList当中,存到适配器中 LayoutInflater inflater = getLayoutInflater(); pageViews = new ArrayList<View>(); pageViews.add(inflater.inflate(R.layout.guide_item1, null)); pageViews.add(inflater.inflate(R.layout.guide_item2, null)); pageViews.add(inflater.inflate(R.layout.guide_item3, null)); pageViews.add(inflater.inflate(R.layout.guide_item4, null)); //将图片存放到ImageView集合中 imageViews = new ImageView[pageViews.size()]; main = (ViewGroup)inflater.inflate(R.layout.guide, null); //获取存放底部导航点ViewGroup group = (ViewGroup)main.findViewById(R.id.guide_point_ll); viewPager = (ViewPager)main.findViewById(R.id.guide_viewpager); imageViewLeft = (ImageView)main.findViewById(R.id.imageView1); imageViewRight = (ImageView)main.findViewById(R.id.imageView2); imageViewLeft.setAlpha(0); imageViewRight.setAlpha(0); //将小圆点放到imageView数组当中 for (int i = 0; i < pageViews.size(); i++) { System.out.println("pageViews.size() = " + pageViews.size()); imageView = new ImageView(GuideActivity.this); imageView.setLayoutParams(new LayoutParams(20,20)); imageView.setPadding(20, 0, 20, 0); imageViews[i] = imageView; if (i == 0) { //默认选中第一张图片 imageViews[i].setBackgroundResource(R.drawable.green_point); } else { imageViews[i].setBackgroundResource(R.drawable.gray_point); } group.addView(imageViews[i]); } setContentView(main); viewPager.setAdapter(new GuidePageAdapter()); viewPager.setOnPageChangeListener(new GuidePageChangeListener()); imageViewLeft.setOnClickListener(new ButtonListener()); imageViewRight.setOnClickListener(new ButtonListener()); } //左右切换屏幕的按钮监听器 class ButtonListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub int showNext=0; if(v.getId() == R.id.imageView1) { System.out.println("点击了向左的按钮"); if(currentIndex ==0 ) showNext = currentIndex; else showNext = currentIndex-1; viewPager.setCurrentItem(showNext); } if(v.getId() == R.id.imageView2){ System.out.println("点击了向右的按钮"); if(currentIndex == imageViews.length) showNext = currentIndex; else showNext = currentIndex+1; viewPager.setCurrentItem(showNext); } System.out.println("当前页码:"+showNext); } } /** * 设置按钮渐显效果 */ private Handler mHandler = new Handler() { public void handleMessage(Message msg) { if(msg.what==1 && mAlpha<255){ //通过设置不透明度设置按钮的渐显效果 mAlpha += 50; if(mAlpha>255) mAlpha=255; imageViewLeft.setAlpha(mAlpha); imageViewLeft.invalidate(); imageViewRight.setAlpha(mAlpha); imageViewRight.invalidate(); if(!isHide && mAlpha<255) mHandler.sendEmptyMessageDelayed(1, 100); }else if(msg.what==0 && mAlpha>0){ mAlpha -= 3; if(mAlpha<0) mAlpha=0; imageViewLeft.setAlpha(mAlpha); imageViewLeft.invalidate(); imageViewRight.setAlpha(mAlpha); imageViewRight.invalidate(); if(isHide && mAlpha>0) mHandler.sendEmptyMessageDelayed(0, 2); } } }; private void showImageButtonView(){ isHide = false; mHandler.sendEmptyMessage(1); } private void hideImageButtonView(){ new Thread(){ public void run() { try { isHide = true; mHandler.sendEmptyMessage(0); } catch (Exception e) { ; } } }.start(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { System.out.println("this is dispatch"); System.out.println("触碰屏幕"); switch (ev.getAction()) { case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_DOWN: showImageButtonView(); break; case MotionEvent.ACTION_UP: hideImageButtonView(); break; } return super.dispatchTouchEvent(ev); } // 指引页面数据适配器,实现适配器方法 class GuidePageAdapter extends PagerAdapter { @Override public int getCount() { return pageViews.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return super.getItemPosition(object); } @Override public void destroyItem(View arg0, int arg1, Object arg2) { // TODO Auto-generated method stub ((ViewPager) arg0).removeView(pageViews.get(arg1)); } @Override public Object instantiateItem(View arg0, int arg1) { // TODO Auto-generated method stub ((ViewPager) arg0).addView(pageViews.get(arg1)); return pageViews.get(arg1); } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { // TODO Auto-generated method stub } @Override public Parcelable saveState() { // TODO Auto-generated method stub return null; } @Override public void startUpdate(View arg0) { // TODO Auto-generated method stub } @Override public void finishUpdate(View arg0) { // TODO Auto-generated method stub } } // 指引页面更改事件监听器,左右滑动图片时候,小圆点变换显示当前图片位置 class GuidePageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int arg0) { currentIndex = arg0; for (int i = 0; i < imageViews.length; i++) { imageViews[arg0].setBackgroundResource(R.drawable.green_point); if (arg0 != i) { imageViews[i].setBackgroundResource(R.drawable.gray_point); } } } } }
使用ViewPage来显示各个布局文件,在四个布局文件中分别放四张图片。
详情请看:http://blog.csdn.net/dawanganban/article/details/17305769
进入主界面后就是我们设置闹钟的界面了,实现如下:
package com.example.alarmtest; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.app.TimePickerDialog; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TimePicker; import android.widget.Toast; public class MainActivity extends Activity { Button button; AlarmManager alarmManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button1); //获取AlarmManager对象 alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Calendar currentTime = Calendar.getInstance(); //创建一个TimePickerDialog实例,并显示 new TimePickerDialog(MainActivity.this, 0, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //指定启动AlarmActivity组件 Intent intent = new Intent(MainActivity.this, AlarmActivity.class); //创建PendingIntent对象 /* * PendingIntent与Intent的区别是PendingIntent处理即将发生的事情 * 比如:在通知栏Notification中跳转页面,不是立即跳转 * 通常通过 getActivity、getBroadcast、getService得到PendingIntent的实例 * */ PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); Calendar c = Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis()); c.set(Calendar.HOUR, hourOfDay); c.set(Calendar.MINUTE, minute); alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); Toast.makeText(MainActivity.this, "设置闹钟成功", Toast.LENGTH_SHORT).show(); } }, currentTime.get(Calendar.HOUR_OF_DAY), currentTime.get(Calendar.MINUTE), false).show(); } }); } }
上面使用了一个时间设置组件TimePickDialog来设置时间,设置完时间后使用AlarmManager的set方法设置闹钟,值得注意的是上面有一个PendingIntent,这个和Intent的区别是PendIntent表示即将发生的意图,常和AlarmManager与Notifycation同时使用。另外,AlarmManager.RTC_WAKEUP表示一个定时器且会发出警报。
闹钟到时间后启动AlarmActivity来播放音乐
package com.example.alarmtest; import android.app.Activity; import android.app.AlertDialog; import android.app.Notification; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.media.MediaPlayer; import android.os.Bundle; public class AlarmActivity extends Activity{ MediaPlayer alarmMusic; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //加载指定音乐,并为之创建MediaPlayer对象 alarmMusic = MediaPlayer.create(this, R.raw.nswdy); alarmMusic.setLooping(true); //播放闹钟 alarmMusic.start(); //创建一个对话框 new AlertDialog.Builder(AlarmActivity.this).setTitle("闹钟") .setMessage("闹钟响了,快起床啦!") .setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //停止音乐 alarmMusic.stop(); AlarmActivity.this.finish(); } }).show(); } }
最后的运行结果:
相关推荐
Android实例源码-小游戏类安卓源代码(7例) 安卓冒险游戏源码可直接运行类似于精灵快跑这种可做毕业设计 安卓飞机游戏 完美版的Android 拼图游戏APK和工程源码 猜拳游戏 用的libgdx引擎写的ACE 弹幕射击游戏设计与...
Android实例源码-文件下载上传类安卓源代码(8例) Android 在线下载压缩包并解压到指定目录 Android快速框架+多线程下载框架的技术(Android + Afinal+gson) 一个支持暂停下载断点续传的源码 下载网络图片 (整合多...
Android实例源码-自定义控件类安卓源代码(20例) androd自定义有进度的圆形进度条.zip Android 4.0风格中文滚动输入.zip Android Form EditText 验证输入合法性的编辑框.zip Android 自定义头部控件,简单易用.rar ...
Android实例源码-应用启动应用退出&网络判断类安卓源代码(12例) 3G和wifi的切换监听 android 在线更新示例代码 android程序的自动更新 和 基于GPS定位的轨迹存储 app更新,实现service下载 ViewPager+Fragment侧滑...
Android实例源码-语音识别&文本朗读类安卓源代码(6例) Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率 PocketSphinxAndroidDemo 三个android语音识别例程mystt 语音合成和语音听写,科大讯飞,...
Android实例源码-音乐播放器类安卓源代码(9例) Android多线程断点续传下载+在线播放音乐 GL音乐播放器 基于SDL、FFmpeg的android播放器源码 简单实用的音乐播放器 简单音乐播放器,实现了播放器基本功能,使用...
Android实例全集-从入门到精通代码库【Eclipse】 1、各种控件的基本使用代码 2、音乐播放器Android代码 3、足球游戏Android代码等等 应有尽有。
Android实例源码-消息推送通知栏类安卓源代码(5例) NotificationTest 消息推送的简单demo 实现Notification的通知栏常驻 消息推送完美demo 消息推送最新demo +服务器 激光推送客户端demo
Android实例源码-支付例子类安卓源代码(11例) BlogForZFB NetPayClinet2.5 for java WS_SECURE_PAY 声波支付例子SinVoice-master 客户端文档及demo_Android 手机银行支付规范 支付SDK 支付宝_安卓苹果_快捷支付_...
Android实例源码-摇一摇&重力传感器类安卓源代码(7例) Android加速度传感器源代码 android姿态传感器源代码 Android摇一摇功能示例源码 “摇一摇”动态更换皮肤完美实现! 加速度传感器 对三个方向的加速度进行...
Android实例源码-下拉上拉刷新类安卓源代码(9例) listview上拉刷新 listview上拉和下拉刷新项目包 listView下拉刷新上拉刷新带阻尼效果 PullToRefresh下拉刷新详细注释版 SwipeRefreshLayoutSample ViewPager中...
Android串口开发(android-serialport-api开发)工程实例。SerialPortUtil里面有我常用的转换工具(16进制字符串转二进制字符串并补位、二进制字符串转16进制字符串并补位)
在这个“Android应用小实例--炫酷计时器”中,我们将深入探讨如何在Android应用中创建并定制一个功能丰富的计时器。 计时器组件在Android SDK中是`android.widget.Chronometer`类,它类似于一个倒计时定时器,但...
《Android-Universal-Image-Loader:高效加载与缓存图片的解决方案》 在移动开发领域,尤其是Android平台,图片加载和缓存是一个重要的课题。Android-Universal-Image-Loader(简称UIL)是一款强大的开源库,专门...
在Android平台上,由于UI线程不能长时间执行耗时操作,因此异步网络请求显得尤为重要,它可以确保用户界面的流畅性。 该库的核心类`AsyncHttpClient`提供了丰富的API,允许开发者轻松发起GET、POST等HTTP请求。例如...
4. 配置AVD(Android Virtual Device):通过AVD Manager创建模拟器实例,选择设备配置、系统镜像和硬件选项,以便在Windows上运行Android应用。 三、使用Android SDK进行开发 1. 创建项目:使用Android Studio,...
本文将基于Delphi XE10,结合小米2和小米5设备,深入探讨如何利用Delphi进行Android蓝牙功能的开发,提供一个实用的实例解析。 首先,我们要明确的是,蓝牙技术在移动设备间的数据传输中扮演着重要角色,尤其在...
这个压缩包文件“Android高级应用源码-Android一个小闹钟例子.zip”包含了关于Android平台上的一个高级应用实例,即一个简单的小闹钟程序。通过分析这个源码,我们可以深入理解Android系统的闹钟服务(AlarmService...
Android 小项目开发示例大全--20个通用具体应用程序实例源码.rar Android 文件下载功能Java多线程下载功能的例子实例源码.rar Android程序源码--贪吃蛇.rar Mp3播放器源码Android实战项目源码.rar 安卓Android中国...
Android 3D openGL 实例, 触摸旋转,通过eclipse ADT插件直接导入即可运行,源码参考性比较高