android闹铃服务

来源:互联网 发布:阿里云 app 编辑:程序博客网 时间:2024/05/14 08:44

原文链接:http://www.cnblogs.com/chiefCTO/archive/2011/09/29/2195231.html。

在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:在模拟器中是运行不了的~

原创粉丝点击