【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2169|回复: 0

【转】Android闹钟的实现!

[复制链接]
发表于 2013-2-26 14:54:21 | 显示全部楼层 |阅读模式

在Android中,有一个闹钟的类,AlarmManager类,我们可以通过其来对系统内的通知进行操作!

  本文用到了Service和Broadcast两个后台管理,在处理时,曾出现过很多问题,但经过半天的努力,终于解决了!

  首先是Main.xml文件:

  1. View Code

  2. <?xml version="1.0" encoding="utf-8"?>
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:orientation="vertical"
  5.     android:layout_width="fill_parent"
  6.     android:layout_height="fill_parent"
  7.     >
  8. <TextView  
  9.     android:id="@+id/mText"
  10.     android:layout_width="fill_parent"
  11.     android:layout_height="wrap_content"
  12.     android:text="@string/hello"
  13.     />
  14.     <Button
  15.     android:id="@+id/setTimeButton"
  16.     android:layout_width="wrap_content"
  17.     android:layout_height="wrap_content"
  18.     android:text="@string/setTimeButton"
  19.     />
  20.     <Button
  21.     android:id="@+id/cancelButton"
  22.     android:layout_width="wrap_content"
  23.     android:layout_height="wrap_content"
  24.     android:text="@string/cancelButton"
  25.     />
  26. </LinearLayout>
复制代码
MainActivity.java:
  1. View Code

  2. package com.chiefcto.Alarm;

  3. import java.text.Format;
  4. import java.util.Calendar;

  5. import android.app.Activity;
  6. import android.app.AlarmManager;
  7. import android.app.PendingIntent;
  8. import android.app.TimePickerDialog;
  9. import android.content.Intent;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.TextView;
  15. import android.widget.TimePicker;

  16. public class MainActivity extends Activity {
  17.     //Properties
  18.     private Button msetButton;
  19.     private Button mcancelButton;
  20.     private AlermReceiver uIReceiver;
  21.    
  22.     private TextView mTextView;
  23.     //就用了Java的日历
  24.     private Calendar calendar;
  25.    
  26.     /** Called when the activity is first created. */
  27.     @Override
  28.     public void onCreate(Bundle savedInstanceState) {
  29.         super.onCreate(savedInstanceState);
  30.         setContentView(R.layout.main);
  31.         
  32.         calendar = Calendar.getInstance();
  33.         
  34.         mTextView = (TextView)this.findViewById(R.id.mText);
  35.         msetButton = (Button)this.findViewById(R.id.setTimeButton);
  36.         mcancelButton = (Button)findViewById(R.id.cancelButton);
  37.         
  38.         msetButton.setOnClickListener(new OnClickListener() {
  39.             
  40.             @Override
  41.             public void onClick(View v) {
  42.                 // TODO Auto-generated method stub
  43.                 calendar.setTimeInMillis(System.currentTimeMillis());
  44.                 int hour = calendar.get(Calendar.HOUR_OF_DAY);
  45.                 int minute = calendar.get(Calendar.MINUTE);
  46.                 new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
  47.                     
  48.                     @Override
  49.                     public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
  50.                         calendar.setTimeInMillis(System.currentTimeMillis());
  51.                         //set(f, value) changes field f to value.
  52.                         calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
  53.                         calendar.set(Calendar.MINUTE, minute);
  54.                         calendar.set(Calendar.SECOND, 0);
  55.                         calendar.set(Calendar.MILLISECOND, 0);
  56.                         
  57.                         Intent intent = new Intent(MainActivity.this, AlermReceiver.class);
  58.                         intent.putExtra("music", true);
  59.                         PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
  60.                         AlarmManager am;
  61.                         
  62.                         //获取系统进程
  63.                         am = (AlarmManager)getSystemService(ALARM_SERVICE);
  64.                         am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
  65.                         //设置周期!!
  66.                         am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(10*1000), (24*60*60*1000), pendingIntent);
  67.                         String tmps = "设置闹钟时间为:"+format(hourOfDay)+":"+format(minute);
  68.                         mTextView.setText(tmps);
  69.                         
  70.                     }
  71.                 },hour,minute,true).show();
  72.             }
  73.         });
  74.         mcancelButton.setOnClickListener(new OnClickListener() {
  75.             
  76.             @Override
  77.             public void onClick(View v) {
  78.                 Intent intent = new Intent(MainActivity.this, AlermReceiver.class);
  79.                 intent.putExtra("music", true);
  80.                 PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
  81.                 AlarmManager am;
  82.                
  83.                 //获取系统进程
  84.                 am = (AlarmManager)getSystemService(ALARM_SERVICE);
  85.                
  86.                 //cancel
  87.                 am.cancel(pendingIntent);
  88.                 mTextView.setText("取消了!");
  89.             }
  90.         });
  91.     }
  92.    
  93.     private String format(int x) {
  94.         String s = ""+x;
  95.         if(s.length() == 1)
  96.             s = "0"+s;
  97.         return s;
  98.     }
  99. }
复制代码
AlarmService.java
  1. View Code

  2. package com.chiefcto.Alarm;

  3. import java.io.IOException;

  4. import android.app.Service;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.media.AudioManager;
  8. import android.media.MediaPlayer;
  9. import android.media.RingtoneManager;
  10. import android.net.Uri;
  11. import android.os.Binder;
  12. import android.os.Bundle;
  13. import android.os.IBinder;

  14. public class AlarmService extends Service {

  15.     // MediaPlayer实例   
  16.     private MediaPlayer player;   
  17.   
  18.     // IBinder实例   
  19.     @Override
  20.     public IBinder onBind(Intent intent) {
  21.         playMusic();   
  22.         return null;
  23.     }

  24.     @Override
  25.     public void onCreate() {
  26.         // TODO Auto-generated method stub
  27.         super.onCreate();
  28.         playMusic();
  29.     }

  30.     @Override
  31.     public void onDestroy() {
  32.         // TODO Auto-generated method stub
  33.         super.onDestroy();
  34.         if (player != null) {   
  35.             player.stop();   
  36.             player.release();   
  37.         }
  38.     }

  39.     @Override
  40.     public void onStart(Intent intent, int startId) {
  41.         // TODO Auto-generated method stub
  42.         super.onStart(intent, startId);
  43.          if (intent != null) {   
  44.                 Bundle bundle = intent.getExtras();   
  45.                 if (bundle != null) {
  46.                     if(bundle.getBoolean("music"))
  47.                         playMusic();
  48.                     else
  49.                         stopMusic();
  50.                 }   
  51.             }
  52.     }
  53.    
  54.     public void playMusic() {
  55.         if(player == null) {
  56.             Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
  57.             try {
  58.                 player = new MediaPlayer();
  59.                 player.setDataSource(this, uri);
  60.                 final AudioManager audioManager = (AudioManager)this
  61.                         .getSystemService(Context.AUDIO_SERVICE);
  62.                 if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
  63.                     player.setAudioStreamType(AudioManager.STREAM_ALARM);
  64.                     player.setLooping(true);
  65.                     player.prepare();
  66.                 }
  67.             } catch (IllegalStateException e) {
  68.                 e.printStackTrace();
  69.             } catch (IOException e) {
  70.                 e.printStackTrace();
  71.             }
  72.         }
  73.         
  74.         if(!player.isPlaying()) {
  75.             player.start();
  76.         }
  77.     }
  78.     public void stopMusic() {   
  79.         if (player != null) {
  80.             player.stop();   
  81.             try {   
  82.                 // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数   
  83.                 player.prepare();   
  84.             } catch (IOException ex) {   
  85.                 ex.printStackTrace();   
  86.             }   
  87.         }
  88.     }
  89. }
复制代码

下面就是本文的关键性代码,了解Activity到Broadcast的机制,这小应用就很好实现了~

AlermReceiver.java

  1. View Code

  2. package com.chiefcto.Alarm;

  3. import java.io.IOException;
  4. import java.util.Calendar;

  5. import android.content.BroadcastReceiver;
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.media.AudioManager;
  9. import android.media.MediaPlayer;
  10. import android.media.RingtoneManager;
  11. import android.net.Uri;
  12. import android.os.Bundle;
  13. import android.util.Log;
  14. import android.widget.Toast;

  15. public class AlermReceiver extends BroadcastReceiver {

  16.     private MediaPlayer mMediaPlayer;
  17.     Context context;

  18.     @Override
  19.     public void onReceive(Context context, Intent intent) {
  20.         // TODO Auto-generated method stub
  21.         Calendar calendar = Calendar.getInstance();
  22.         calendar.setTimeInMillis(System.currentTimeMillis());
  23.         int minute = calendar.get(Calendar.MINUTE);
  24.         CharSequence text = String.valueOf(minute);
  25.         Toast.makeText(context, text, Toast.LENGTH_LONG).show();
  26.         this.context = context;
  27.         Bundle bundle = intent.getExtras();
  28.         Intent serviceIntent = new Intent("chief_musicService");
  29.         serviceIntent.putExtras(bundle);
  30.         if(bundle != null) {
  31.             Log.i("CTO", String.valueOf(bundle.getBoolean("music")));
  32.             if(bundle.getBoolean("music"))
  33.                 context.startService(serviceIntent);
  34.             else
  35.                 context.stopService(serviceIntent);
  36.         }
  37.         //在这里是播放不了的!!
  38.         //playAlarmRing();
  39.     }

  40.     private void playAlarmRing() {
  41.         Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
  42.         try {
  43.             mMediaPlayer = new MediaPlayer();
  44.             mMediaPlayer.setDataSource(context, uri);
  45.             final AudioManager audioManager = (AudioManager) context
  46.                     .getSystemService(Context.AUDIO_SERVICE);
  47.             if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
  48.                 mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
  49.                 mMediaPlayer.setLooping(true);
  50.                 mMediaPlayer.prepare();
  51.             }
  52.         } catch (IllegalStateException e) {
  53.             e.printStackTrace();
  54.         } catch (IOException e) {
  55.             e.printStackTrace();
  56.         }
  57.         mMediaPlayer.start();
  58.     }

  59.     private void StopAlarmRing() {
  60.         mMediaPlayer.stop();
  61.     }
  62. }
复制代码
要注意的是Mainifest.xml:
  1. View Code

  2. <?xml version="1.0" encoding="utf-8"?>
  3. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  4.       package="com.chiefcto.Alarm"
  5.       android:versionCode="1"
  6.       android:versionName="1.0">
  7.     <uses-sdk android:minSdkVersion="7" />

  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">
  9.         <activity android:name=".MainActivity"
  10.                   android:label="@string/app_name">
  11.             <intent-filter>
  12.                 <action android:name="android.intent.action.MAIN" />
  13.                 <category android:name="android.intent.category.LAUNCHER" />
  14.             </intent-filter>
  15.         </activity>
  16.         <service android:name=".AlarmService">
  17.             <intent-filter>
  18.                 <action android:name="chief_musicService"/>
  19.                 <category android:name="android.intent.category.DEFAULT"/>
  20.             </intent-filter>
  21.         </service>
  22.         <receiver android:name=".AlermReceiver" android:process=":remote"/>
  23.    
  24.     </application>
  25.     <uses-permission android:name="android.permission.MOUT_UNMOUNT_FILESYSTEMS"/>
  26. </manifest>
复制代码

PS:在模拟器中是运行不了的~


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-6 14:07

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表