手滑先發到博客頻道瞭。。不知道現在這樣算不算重復發帖。。……罪過
前段時間在論壇上看到一個帖子,說瞭一個關於短信dota鈴聲的主意,正好自己在學習Android,就當試手做瞭一下,拿來分享一下,因為功力還非常淺,還希望大傢多給提點意見,不管是從代碼規范也好,實現方式也好。
程序主要功能是在短信來時播放超神(Holy Shit)的音效,並且在一定時間內如果繼續有短信,則會繼續播放Holy Shit Double Kill,Holy Shit Triple Kill。。。程序界面上就放瞭3個按鈕,分別是用於啟用,停止和設置間隔時間的,原來想稍微弄點圖片美化下,後來也沒弄
整個程序的邏輯是非常簡單的,隻是開啟一個Service監聽短信的事件,在短信到達後進行聲音播放的處理,牽涉到的主要是Service,Broadcast,MediaPlayer,還有為瞭設置間隔時間還用瞭最簡單的Preference。
為瞭讓帖子不顯得太簡陋,貼上一些簡單的代碼,程序有3個類,分別是主程序Activity,後臺跑的Service,以及設置用的PreferenceActivity
Activity中沒有什麼特別的地方,就是為3個Button設置瞭相應的事件
Java代碼
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Toast.makeText(DotaBellActivity.this, "start", Toast.LENGTH_SHORT).show();
Intent serviceIntent=new Intent();
serviceIntent.setClass(DotaBellActivity.this, BellService.class);
startService(serviceIntent);
}
});
endButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Toast.makeText(DotaBellActivity.this, "end", Toast.LENGTH_SHORT).show();
//停止服務
Intent serviceIntent=new Intent();
serviceIntent.setClass(DotaBellActivity.this, BellService.class);
stopService(serviceIntent);
}
});
configButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Toast.makeText(DotaBellActivity.this, "config", Toast.LENGTH_SHORT).show();
Intent preferenceIntent=new Intent();
preferenceIntent.setClass(DotaBellActivity.this, BellConfigPreference.class);
startActivity(preferenceIntent);
}
});
Service中就是主要的一些處理部分,包含瞭存放鈴聲的Map和播放鈴聲等邏輯處理,第一次做的時候由於是采用MediaPlayer來播放,出現瞭用戶多媒體聲音關閉時候沒有效果的情況,後來通過AudioManager來暫時打開多媒體聲音,播放完再關閉解決瞭這一問題。
Java代碼
//播放音效
private void playBell(Context context, int num) {
//為防止用戶當前模式關閉瞭media音效 先將media打開
am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);//獲取音量控制
currentMediaStatus=am.getStreamVolume(AudioManager.STREAM_MUSIC);
currentMediaMax=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
am.setStreamVolume(AudioManager.STREAM_MUSIC, currentMediaMax, 0);
//創建MediaPlayer 進行播放
MediaPlayer mp = MediaPlayer.create(context, getBellResource());
mp.setOnCompletionListener(new musicCompletionListener());
mp.start();
}
private class musicCompletionListener implements OnCompletionListener {
@Override
public void onCompletion(MediaPlayer mp) {
//播放結束釋放mp資源
mp.release();
//恢復用戶之前的media模式
am.setStreamVolume(AudioManager.STREAM_MUSIC, currentMediaStatus, 0);
}
}
//獲取當前應該播放的鈴聲
private int getBellResource() {
//判斷時間間隔(毫秒)
int preferenceInterval;
long interval;
Date curTime = new Date(System.currentTimeMillis());
interval=curTime.getTime()-lastSMSTime.getTime();
lastSMSTime=curTime;
preferenceInterval=getPreferenceInterval();
if(interval<preferenceInterval*60*1000&&!justStart){
currentBell++;
if(currentBell>5){
currentBell=5;
}
}else{
currentBell=1;
}
justStart=false;
return bellMap.get(currentBell);
}
//獲取Preference設置
private int getPreferenceInterval(){
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
int interval=Integer.valueOf(settings.getString("interval_config", "5"));
// Log.v("COOKIE", "interval: "+interval);
return interval;
}
Preference中就沒有邏輯代碼,都通過xml文件搞定瞭
附上工程以及apk文件(其實工程裡也有),個人覺得像自己經常打遊戲忘瞭回短信之類的。。猛的holyshit一下還是可以提提神的
同時也希望通過交流認識更多的朋友,不管是Android,java,C#,甚至前端等等,本人患嚴重拖延癥,一個人就容易閑下來,所以希望更多的學習碰撞可以讓自己一直保持熱情,上述的小程序也當是給征友找夥伴投石問路,如果達人們願意平時指導指導小弟,交流交流技術,可以短消息聯系,大傢共同進步。