`
gaotong1991
  • 浏览: 92812 次
  • 来自: 北京
社区版块
存档分类
最新评论

Android实例练习-可爱的小闹钟

阅读更多

摘要:

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

 

最后的运行结果:

                   

                  

 

2
0
分享到:
评论

相关推荐

    Android实例源码-小游戏类安卓源代码(7例).zip

    Android实例源码-小游戏类安卓源代码(7例) 安卓冒险游戏源码可直接运行类似于精灵快跑这种可做毕业设计 安卓飞机游戏 完美版的Android 拼图游戏APK和工程源码 猜拳游戏 用的libgdx引擎写的ACE 弹幕射击游戏设计与...

    Android实例源码-文件下载上传类安卓源代码(8例).zip

    Android实例源码-文件下载上传类安卓源代码(8例) Android 在线下载压缩包并解压到指定目录 Android快速框架+多线程下载框架的技术(Android + Afinal+gson) 一个支持暂停下载断点续传的源码 下载网络图片 (整合多...

    Android实例源码-自定义控件类安卓源代码(20例).zip

    Android实例源码-自定义控件类安卓源代码(20例) androd自定义有进度的圆形进度条.zip Android 4.0风格中文滚动输入.zip Android Form EditText 验证输入合法性的编辑框.zip Android 自定义头部控件,简单易用.rar ...

    Android实例源码-应用启动应用退出&网络判断类安卓源代码(12例).zip

    Android实例源码-应用启动应用退出&网络判断类安卓源代码(12例) 3G和wifi的切换监听 android 在线更新示例代码 android程序的自动更新 和 基于GPS定位的轨迹存储 app更新,实现service下载 ViewPager+Fragment侧滑...

    Android实例源码-语音识别&文本朗读类安卓源代码(6例).zip

    Android实例源码-语音识别&文本朗读类安卓源代码(6例) Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率 PocketSphinxAndroidDemo 三个android语音识别例程mystt 语音合成和语音听写,科大讯飞,...

    Android实例源码-音乐播放器类安卓源代码(9例).zip

    Android实例源码-音乐播放器类安卓源代码(9例) Android多线程断点续传下载+在线播放音乐 GL音乐播放器 基于SDL、FFmpeg的android播放器源码 简单实用的音乐播放器 简单音乐播放器,实现了播放器基本功能,使用...

    Android实例全集-从入门到精通代码库

    Android实例全集-从入门到精通代码库【Eclipse】 1、各种控件的基本使用代码 2、音乐播放器Android代码 3、足球游戏Android代码等等 应有尽有。

    Android实例源码-消息推送通知栏类安卓源代码(5例).zip

    Android实例源码-消息推送通知栏类安卓源代码(5例) NotificationTest 消息推送的简单demo 实现Notification的通知栏常驻 消息推送完美demo 消息推送最新demo +服务器 激光推送客户端demo

    Android实例源码-支付例子类安卓源代码(11例).zip

    Android实例源码-支付例子类安卓源代码(11例) BlogForZFB NetPayClinet2.5 for java WS_SECURE_PAY 声波支付例子SinVoice-master 客户端文档及demo_Android 手机银行支付规范 支付SDK 支付宝_安卓苹果_快捷支付_...

    Android实例源码-摇一摇&重力传感器类安卓源代码(7例).zip

    Android实例源码-摇一摇&重力传感器类安卓源代码(7例) Android加速度传感器源代码 android姿态传感器源代码 Android摇一摇功能示例源码 “摇一摇”动态更换皮肤完美实现! 加速度传感器 对三个方向的加速度进行...

    安卓Android源码——Android自定义锁屏实现----仿正点闹钟.zip

    这个"安卓Android源码——Android自定义锁屏实现----仿正点闹钟.zip"压缩包文件提供了一个实例,展示了如何模仿“正点闹钟”的锁屏功能。通过分析和学习这个源码,我们可以了解到Android系统的锁屏机制以及如何进行...

    Android实例源码-下拉上拉刷新类安卓源代码(9例).zip

    Android实例源码-下拉上拉刷新类安卓源代码(9例) listview上拉刷新 listview上拉和下拉刷新项目包 listView下拉刷新上拉刷新带阻尼效果 PullToRefresh下拉刷新详细注释版 SwipeRefreshLayoutSample ViewPager中...

    Android串口开发(android-serialport-api开发)工程实例

    Android串口开发(android-serialport-api开发)工程实例。SerialPortUtil里面有我常用的转换工具(16进制字符串转二进制字符串并补位、二进制字符串转16进制字符串并补位)

    Android应用小实例--炫酷计时器

    在这个“Android应用小实例--炫酷计时器”中,我们将深入探讨如何在Android应用中创建并定制一个功能丰富的计时器。 计时器组件在Android SDK中是`android.widget.Chronometer`类,它类似于一个倒计时定时器,但...

    Android-Universal-Image-Loader Demo和jar包

    《Android-Universal-Image-Loader:高效加载与缓存图片的解决方案》 在移动开发领域,尤其是Android平台,图片加载和缓存是一个重要的课题。Android-Universal-Image-Loader(简称UIL)是一款强大的开源库,专门...

    android-async-http-master

    在Android平台上,由于UI线程不能长时间执行耗时操作,因此异步网络请求显得尤为重要,它可以确保用户界面的流畅性。 该库的核心类`AsyncHttpClient`提供了丰富的API,允许开发者轻松发起GET、POST等HTTP请求。例如...

    android-sdk-windows.rar

    4. 配置AVD(Android Virtual Device):通过AVD Manager创建模拟器实例,选择设备配置、系统镜像和硬件选项,以便在Windows上运行Android应用。 三、使用Android SDK进行开发 1. 创建项目:使用Android Studio,...

    Android实例-Delphi开发蓝牙官方实例解析(XE10+小米2+小米5)

    本文将基于Delphi XE10,结合小米2和小米5设备,深入探讨如何利用Delphi进行Android蓝牙功能的开发,提供一个实用的实例解析。 首先,我们要明确的是,蓝牙技术在移动设备间的数据传输中扮演着重要角色,尤其在...

    Android高级应用源码-Android一个小闹钟例子.zip

    这个压缩包文件“Android高级应用源码-Android一个小闹钟例子.zip”包含了关于Android平台上的一个高级应用实例,即一个简单的小闹钟程序。通过分析这个源码,我们可以深入理解Android系统的闹钟服务(AlarmService...

    Android安卓应用程序开发实例源码合集(安卓工程源码).zip

    Android 小项目开发示例大全--20个通用具体应用程序实例源码.rar Android 文件下载功能Java多线程下载功能的例子实例源码.rar Android程序源码--贪吃蛇.rar Mp3播放器源码Android实战项目源码.rar 安卓Android中国...

Global site tag (gtag.js) - Google Analytics