摘要:

这一篇主要使用系统为我们提供的一个服务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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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(){@Overridepublic 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; @Overrideprotected 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;@Overrideprotected 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() {@Overridepublic void onClick(View arg0) {Calendar currentTime = Calendar.getInstance();//创建一个TimePickerDialog实例,并显示new TimePickerDialog(MainActivity.this, 0, new TimePickerDialog.OnTimeSetListener() {@Overridepublic 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;@Overrideprotected 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {//停止音乐alarmMusic.stop();AlarmActivity.this.finish();}}).show();}
}

最后的运行结果:

                   

                  

源代码下载:http://download.csdn.net/detail/lxq_xsyu/6963763

转载于:https://www.cnblogs.com/lanzhi/p/6469177.html

Android菜鸟的成长笔记(25)——可爱的小闹钟相关推荐

  1. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文: [置顶] Android菜鸟的成长笔记(11)--Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调 ...

  2. Android菜鸟的成长笔记(13)——异步任务(Async Task)

    Android菜鸟的成长笔记(13)--异步任务(Async Task) 原文: [置顶] Android菜鸟的成长笔记(13)--异步任务(Async Task) Android的UI线程主要负责处 ...

  3. Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy

    上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有点像QQ的登录界面,但是很多地方还是很难看,这一篇咱们来将这个界面做成一个标 ...

  4. Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?

    在上一篇中我们用Android系统源代码分析了我们前面写的代码,有的朋友可能就会问怎么才能下载到Google官方的源代码呢?下面我们通过Git管理工具来对Android系统源代码进行下载.另外为了方便 ...

  5. Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持

    在Google官方Android设计指南中(链接:http://www.apkbus.com/design/get-started/ui-overview.html)有一个新特性就是自我标识,也就是宣 ...

  6. Android菜鸟的成长笔记(16)——Service简介

    Service是Android四大组件之一 1.Service与Activity的区别在:Service一直在后台运行,没有用户界面. 2.选择Activity与Service的标准:如果某个程序组件 ...

  7. 一个Android菜鸟入门Flutter 笔记(一)

    1. Dart 基础语法 1.1 hello world 先来看个hello world,入口依然是main方法. printInteger(int a) {print('Hello world, t ...

  8. Android登陆demo:界面设计及业务代码———Android菜鸟的成长日记

    距离上一次更新,两天前. 今天就从头开始来学习,当然是直接上案例了,就不扭扭捏捏的上基础知识了,基础知识是自己去学的,我直接从小的demo入手,开始新一轮的学习之路. 首先是关于界面设计(布局): 关 ...

  9. 一个Android菜鸟入门Flutter 笔记(二)

    1. 网络编程与JSON解析 默认的HttpClient请求网络 get() async {//创建网络调用示例,设置通用请求行为(超时时间)var httpClient = HttpClient() ...

最新文章

  1. 您对TOP Server的德语、中文和日语语言支持了解吗?(二)
  2. 去 IOE,MySQL 完胜 PostgreSQL
  3. 缓存依赖中cachedependency对象
  4. 获取远程linux版本,远程批量获取Linux和Windos操作系统版本(内核)
  5. php mysql安装_搭建PHP环境中的MySQL配置
  6. linux qt创建静态库,QT创建与QT无关的纯C++程序和动态/静态库
  7. matlab在机械手臂中基础,关于MATLAB中的机械臂算法的分析和介绍
  8. EAS 后台事务定时执行设置
  9. 手机哔哩哔哩缓存的m4s格式的视频转换成mp4
  10. 域名ip查询步骤与域名如何解析到ip
  11. 不同方向程序员工资一览!
  12. 使用SaltStack Returner将Salt作业信息接入Elasticsearch的实践(踩坑)
  13. python 正则表达式量词
  14. 基于SSM+Vue的邮票管理系统的设计与实现Java邮票分享系统邮票鉴定前后端分离(源码调试+讲解+文档)
  15. Python读取和处理mf4
  16. NumPy的数组对象:ndarray
  17. mpVue的基本介绍
  18. 开发微信小程序:设置某个页面为启动后打开的第一个页面
  19. springboot项目启动报连接redis的相关错误
  20. 利用Docker配置influxdb集群

热门文章

  1. Nature最新封面:哺乳动物有「一键返老还童」按钮,复旦校友的这项研究恢复了老年小鼠视力...
  2. 一场实验室意外爆炸事故,解决了58年量子难题,让科学家意外发现“核电共振”...
  3. 马斯克明年送3人到太空站旅游:票价3.8亿,仅剩2席,手慢无
  4. fiddler+android抓包工具配置使用
  5. DroidPilot 测试脚本详解 (一)
  6. 2009年依然兑现不了的10大IT安全预期
  7. 科幻片天际SKYLINE,喜欢科幻的朋友不要错过。
  8. 转载 .net面试题大全(有答案)
  9. 从CCNA到CCIE的网工认证道路规划
  10. php7.1函数,PHP7.1常用新特性和函数