摘要:

这一篇主要使用系统为我们提供的一个服务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();      }  }  

最后的运行结果:

更多相关文章

  1. Android39_Clock和TimePicker
  2. Android(安卓)Material Design之CardView(卡片式布局)
  3. Ubuntu下Genymotion模拟器启动卡死
  4. android 7.0 有关wifi热点设置信息
  5. 二、Toolbar
  6. Android开发常用命令整理
  7. Android(安卓)GLSurfaceView详解
  8. Android(安卓)TextView部分文字实现点击事件
  9. Android自屏幕底部滑出更多面板的实现

随机推荐

  1. MMKV记录
  2. 我的Android进阶之旅------>Android获取
  3. Android(安卓)-- ImageLoader简析
  4. Android之CSDN 牛人博客索引
  5. Android studio 编译失败Error:Could not
  6. android客户端向服务器端验证登陆方法的
  7. Android 批量读取APK 包名,版本信息
  8. Android(安卓)xml 文件代码自动提示
  9. Android注解——Butter Knife的使用
  10. 关于Android中的radioGroup选择