您的位置:首页 > 移动开发 > Android开发

Android闹钟的实现!

2012-10-29 21:38 681 查看
  在Android中,有一个闹钟的类,AlarmManager类,我们可以通过其来对系统内的通知进行操作!

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

  首先是Main.xml文件:


View
Code




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:id="@+id/mText"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    <Button
    android:id="@+id/setTimeButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/setTimeButton"
    />
    <Button
    android:id="@+id/cancelButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancelButton"
    />
</LinearLayout>





MainActivity.java:


View
Code




package com.chiefcto.Alarm;

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

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
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.TextView;
import android.widget.TimePicker;

public class MainActivity extends Activity {
    //Properties
    private Button msetButton;
    private Button mcancelButton;
    private AlermReceiver uIReceiver;
    
    private TextView mTextView;
    //就用了Java的日历
    private Calendar calendar;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        calendar = Calendar.getInstance();
        
        mTextView = (TextView)this.findViewById(R.id.mText);
        msetButton = (Button)this.findViewById(R.id.setTimeButton);
        mcancelButton = (Button)findViewById(R.id.cancelButton);
        
        msetButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                calendar.setTimeInMillis(System.currentTimeMillis());
                int hour = calendar.get(Calendar.HOUR_OF_DAY);
                int minute = calendar.get(Calendar.MINUTE);
                new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
                    
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        calendar.setTimeInMillis(System.currentTimeMillis());
                        //set(f, value) changes field f to value.
                        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
                        calendar.set(Calendar.MINUTE, minute);
                        calendar.set(Calendar.SECOND, 0);
                        calendar.set(Calendar.MILLISECOND, 0);
                        
                        Intent intent = new Intent(MainActivity.this, AlermReceiver.class);
                        intent.putExtra("music", true);
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
                        AlarmManager am;
                        
                        //获取系统进程
                        am = (AlarmManager)getSystemService(ALARM_SERVICE);
                        am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                        //设置周期!!
                        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(10*1000), (24*60*60*1000), pendingIntent);
                        String tmps = "设置闹钟时间为:"+format(hourOfDay)+":"+format(minute);
                        mTextView.setText(tmps);
                        
                    }
                },hour,minute,true).show();
            }
        });
        mcancelButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AlermReceiver.class);
                intent.putExtra("music", true);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
                AlarmManager am;
                
                //获取系统进程
                am = (AlarmManager)getSystemService(ALARM_SERVICE);
                
                //cancel
                am.cancel(pendingIntent);
                mTextView.setText("取消了!");
            }
        });
    }
    
    private String format(int x) {
        String s = ""+x;
        if(s.length() == 1)
            s = "0"+s;
        return s;
    }
}





AlarmService.java


View
Code




package com.chiefcto.Alarm;

import java.io.IOException;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;

public class AlarmService extends Service {

    // MediaPlayer实例   
    private MediaPlayer player;   
  
    // IBinder实例   
    @Override
    public IBinder onBind(Intent intent) {
        playMusic();   
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        playMusic();
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if (player != null) {   
            player.stop();   
            player.release();   
        }
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
         if (intent != null) {   
                Bundle bundle = intent.getExtras();   
                if (bundle != null) {
                    if(bundle.getBoolean("music"))
                        playMusic();
                    else
                        stopMusic();
                }   
            }
    }
    
    public void playMusic() {
        if(player == null) {
            Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
            try {
                player = new MediaPlayer();
                player.setDataSource(this, uri);
                final AudioManager audioManager = (AudioManager)this
                        .getSystemService(Context.AUDIO_SERVICE);
                if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
                    player.setAudioStreamType(AudioManager.STREAM_ALARM);
                    player.setLooping(true);
                    player.prepare();
                }
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        if(!player.isPlaying()) {
            player.start();
        }
    }
    public void stopMusic() {   
        if (player != null) { 
            player.stop();   
            try {   
                // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数   
                player.prepare();   
            } catch (IOException ex) {   
                ex.printStackTrace();   
            }   
        }
    }
}





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

AlermReceiver.java


View
Code




package com.chiefcto.Alarm;

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

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class AlermReceiver extends BroadcastReceiver {

    private MediaPlayer mMediaPlayer;
    Context context;

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        int minute = calendar.get(Calendar.MINUTE);
        CharSequence text = String.valueOf(minute);
        Toast.makeText(context, text, Toast.LENGTH_LONG).show();
        this.context = context;
        Bundle bundle = intent.getExtras();
        Intent serviceIntent = new Intent("chief_musicService");
        serviceIntent.putExtras(bundle);
        if(bundle != null) {
            Log.i("CTO", String.valueOf(bundle.getBoolean("music")));
            if(bundle.getBoolean("music"))
                context.startService(serviceIntent);
            else
                context.stopService(serviceIntent);
        }
        //在这里是播放不了的!!
        //playAlarmRing();
    }

    private void playAlarmRing() {
        Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        try {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(context, uri);
            final AudioManager audioManager = (AudioManager) context
                    .getSystemService(Context.AUDIO_SERVICE);
            if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
                mMediaPlayer.setLooping(true);
                mMediaPlayer.prepare();
            }
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mMediaPlayer.start();
    }

    private void StopAlarmRing() {
        mMediaPlayer.stop();
    }
}





要注意的是Mainifest.xml:


View
Code




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

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".AlarmService">
            <intent-filter>
                <action android:name="chief_musicService"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>
        <receiver android:name=".AlermReceiver" android:process=":remote"/>
    
    </application>
    <uses-permission android:name="android.permission.MOUT_UNMOUNT_FILESYSTEMS"/>
</manifest>





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



原文地址:http://www.cnblogs.com/chiefCTO/archive/2011/09/29/2195231.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: