編輯:關於Android編程
首先,附上程序運行後的效果,如下圖所示:

一.部署一個web項目到tomcat服務器上:
1.這個小程序是結合網絡來播放一首音樂的,首先,把我們搞好的一個web項目放置在tomcat安裝目錄下的webapps目錄底下,其中這個web項目名為music,目錄結構如下:

其中我們的音樂放置在如下圖的目錄底下:

2.接著我們開啟tomcat 7.0服務器,我安裝的tomcat是exe格式的,所以我在計算機—管理——服務和應用程序—服務 下有一個tomcat 7.0的服務,開啟後如下圖所示:

注:如果你安裝tomcat的格式是以壓縮包的格式,可以打開tomcat解壓目錄後的bin目錄下的startup.bat批處理文件開啟這個服務。
3.開啟完tomcat服務器,此時就把music這個web項目部署到tomcat服務器上了,此時就可以開始編寫我們的安卓代碼了。
二.在我們寫安卓代碼之前,還需要一個小小的步驟,就是我們安卓要如何訪問我們部署到tomcat服務器上的項目,在web項目中,我們訪問一個網頁可以在地址欄輸入:http://localhost:8083/music/index.jsp 這樣來訪問index.jsp頁面,其中localhost也可以改為127.0.0.1,即代表本機,其中8083為一個端口號,但是在安卓中訪問一個web項目有一些區別,其中有下面這幾個小步驟:
1.首先,必須知道我們自己計算機上的IP地址,我們可以打開cmd命令行窗口,輸入命令ipconfig,如下圖所示:

其中選擇你已經連上的網絡的IPv4地址,這個IP地址是安卓和web項目進行網絡連接所需要的。
2.接著,我們必須要知道我們tomcat服務器上的端口號是多少,我的是8083,我們要怎麼查看tomcat的端口號呢,可以打開tomcat安裝目錄下的conf目錄下的server.xml文件,看下端口號,如下圖所示:

其中如果端口號占用的話,可以通過修改server.xml文件來修改端口號,即上圖中的紅色框起來的地方中的port值。
3.此時,在我們安卓中要訪問部署在tomcat服務器上的web項目裡的文件,可以使用下面的地址:http://192.168.1.1:8083/BBS/index.jsp,這樣就可以訪問web項目了,其中192.168.1.1為本機的IP地址,8083為服務器的端口號,其中我們可以直接在浏覽器中輸入http://192.168.1.1:8083/BBS/index.jsp 訪問這個index.jsp頁面。
三.接下來就可以編寫安卓代碼了:
1.首先,新建一個android項目,打開layout目錄下的activity_main.xml布局文件,代碼如下:
其中的一個id為finish的ImageView(圖片視圖)和底下的三個Button(按鈕)都有一個android:onClick屬性,都為click,所以在MainActivity類就要寫一個click()方法,這個方法為ImageView和Button點擊時觸發的方法,這樣就可以減少代碼量,不用使用findViewById和設置事件監聽了。
2.其中activity_main.xml布局文件所需的文字我都放在strings.xml文件裡,代碼如下:
通過網絡播放音樂 Hello world! Settings 金海心—那麼驕傲 播放 暫停 停止 退出
3.接著附上MainActivity.java文件的代碼,代碼如下:
package com.example.android_intent_playmusic;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Intent intent = new Intent(MainActivity.this, MusicService.class);//實例化一個Intent對象
int op = -1;//設置中間變量op
switch (v.getId()) {
case R.id.play://當點擊的為播放按鈕時
op = 1;
break;
case R.id.pause://當點擊暫停按鈕時
op = 2;
break;
case R.id.stop://當點擊停止按鈕時
op = 3;
break;
case R.id.finish://當點擊返回圖片按鈕
finish();//返回上一個界面
break;
default:
break;
}
Bundle bundle = new Bundle();//實例化一個Bundle對象
bundle.putInt(msg, op);//把op的值放入到bundle對象中
intent.putExtras(bundle);//再把bundle對象放入intent對象中
startService(intent);//開啟這個服務
}
}
其中的click()方法裡的switch case語句來判斷點擊的是哪個按鈕,並通過op這個中間變量傳遞給MusicService服務類,在MainActivity中開啟MusicService這個服務。
4. 接下來附上MusicService這個服務類,這個類繼承了Service類,代碼如下:
package com.example.android_intent_playmusic;
import java.io.IOException;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
public class MusicService extends Service {
private MediaPlayer player;//聲明一個MediaPlayer對象
@Override
public IBinder onBind(Intent arg0) {
// TODO 自動生成的方法存根
return null;
}
//創建服務
@Override
public void onCreate() {
// 當player對象為空時
if (player == null) {
player = MediaPlayer.create(MusicService.this, Uri
.parse(http://192.168.1.110:8083/music/music/music2.mp3));//實例化對象,通過播放本機服務器上的一首音樂
player.setLooping(false);//設置不循環播放
}
super.onCreate();
}
//銷毀服務
@Override
public void onDestroy() {
//當對象不為空時
if (player != null) {
player.stop();//停止播放
player.release();//釋放資源
player = null;//把player對象設置為null
}
super.onDestroy();
}
//開始服務
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO 自動生成的方法存根
Bundle b = intent.getExtras();//獲取到從MainActivity類中傳遞過來的Bundle對象
int op = b.getInt(msg);//再獲取到MainActivity類中op的值
switch (op) {
case 1://當op為1時,即點擊播放按鈕時
play();//調用play()方法
break;
case 2://當op為2時,即點擊暫停按鈕時
pause();//調用pause()方法
break;
case 3://當op為3時,即點擊停止按鈕時
stop();//調用stop()方法
break;
default:
break;
}
return super.onStartCommand(intent, flags, startId);
}
//停止播放音樂方法
private void stop() {
// 當player對象不為空時
if (player != null) {
player.seekTo(0);//設置從頭開始
player.stop();//停止播放
try {
player.prepare();//預加載音樂
} catch (IllegalStateException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
//暫停播放音樂方法
private void pause() {
// 當player對象正在播放時並且player對象不為空時
if (player.isPlaying() && player != null) {
player.pause();//暫停播放音樂
}
}
//播放音樂方法
private void play() {
// 當player對象不為空並且player不是正在播放時
if (player != null && !player.isPlaying()) {
player.start();//開始播放音樂
}
}
}
其中通過如下代碼:
player = MediaPlayer.create(MusicService.this, Uri.parse(http://192.168.1.115:8083/music/music/music2.mp3));這樣就可以訪問部署在tomcat服務器上的music項目底下的mp3文件。
5.最後,不要忘了兩件事,第一,我們必須要將MusicService類在AndroidManifest.xml文件裡聲明這個service。第二,因為我們是通過網絡來訪問本機服務器中的web項目,所以我們必須要在AndroidManifest.xml文件裡指定一個允許訪問網絡資源的權限。
(1).聲明service,放在標記下,代碼如下:
(2).此程序需要訪問網絡資源,所以需要在AndroidManifest.xml文件指定允許訪問網絡資源的權限,具體代碼如下:
四.運行此android項目,效果如上面的效果圖。點擊播放按鈕,開始播放音樂;點擊暫停按鈕,暫停播放,再次點擊播放按鈕,繼續播放;點擊停止按鈕,停止播放,再次點擊播放按鈕,從頭開始播放;點擊上面的返回圖片,返回到上一個頁面。
其中,上述代碼中沒有關閉服務,如果想要停止服務的話,可以調用stopService(intent)這個方法,其中intent指的是在MainActivity類中實例化的Intent對象。
Android官方文檔之Location and Sensors APIs(下)
本文將介紹運動傳感器(Motion Sensors)、位置傳感器(Position Sensors)、環境傳感器(Environment Sensors)。如需訪問官方原
深入解析Android中的RecyclerView組件
前些日子,組裡為了在目前的Android程序裡實現基於ListView子項的動畫效果,希望將最新的RecyclerView引入到程序中,於是我便花了一些時間研究了一下Re
使用runtime 實現weex 跳轉原生頁面
一、簡述 最近項目組打算引入weex,並選定了一個頁面進行試水。頁面很簡單,主要是獲取數據渲染頁面,並可以跳轉到指定的頁面。跟之前使用RN 相比,weex 確實要簡單很
Android實現字母雨的效果
首先來看效果: 一、實現原理在實現過程中,主要考慮整個界面由若干個字母組成的子母線條組成,這樣的話把固定數量的字母封裝成一個字母線條,而每個字母又封裝成一個對象,這樣的話