編輯:關於Android編程
原來總感覺四大組建Service和Broadcaster Receiver用的少,其實不然,只是因為比較抽象,他們總是默默無聞的在後台進行服務
寫了個demo測試了一下,一個是生命周期,一個是綁定服務,解綁服務,感覺這個用mp3播放比較形象
下面是工程列表,感覺在順序上不只是Eclipse還是google調整了一下
MainActivity.class
package cn.edu.sjzc.fanyafeng.activity;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import cn.edu.sjzc.fanyafeng.service.MyService;
import cn.edu.sjzc.fanyafeng.servicedemo.R;
public class MainActivity extends Activity implements OnClickListener {
private Button start, end, bind, unbind;
private static String TAG = "生命周期";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate方法執行");
initView();
}
private void initView() {
this.start = (Button) MainActivity.this.findViewById(R.id.start);
this.start.setOnClickListener(this);
this.end = (Button) MainActivity.this.findViewById(R.id.end);
this.end.setOnClickListener(this);
this.bind = (Button) MainActivity.this.findViewById(R.id.bind);
this.bind.setOnClickListener(this);
this.unbind = (Button) MainActivity.this.findViewById(R.id.unbind);
this.unbind.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this,MyService.class);
switch (v.getId()) {
case R.id.start:
startService(intent);
break;
case R.id.end:
stopService(intent);
break;
case R.id.bind:
bindService(intent, conn, BIND_AUTO_CREATE);
break;
case R.id.unbind:
unbindService(conn);
break;
default:
break;
}
}
final ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
}
};
}
MyService.java
package cn.edu.sjzc.fanyafeng.service;
import cn.edu.sjzc.fanyafeng.servicedemo.R;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
// 定義輸入日志
private static String TAG = "生命周期";
// 定義音樂播放變量
private MediaPlayer mPlayer;
private MyBinder mBinder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, "onBind()執行");
// mPlayer.start();
return mBinder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.i(TAG, "onCreate()執行");//第一個執行
//R.raw.xxxx其中raw不能換成其他的名稱,不然Android識別不出來,囧
mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.qimiaozhongdejiyi);
//設置音樂循環播放,這個大家可以想一下Handler其中的Looper
mPlayer.setLooping(true);
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Log.i(TAG, "onDestroy()執行");//停止播放時執行
mPlayer.stop();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.i(TAG, "onStartCommand()執行");//第二個執行
mPlayer.start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, "onUnbind()執行");
return super.onUnbind(intent);
}
@SuppressWarnings("deprecation")
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
//onStart方法被谷歌打上了橫槓,不建議大家使用
Log.i(TAG, "onStart()執行");//第三個執行
//start()方法放在onStartCommand
// mPlayer.start();
super.onStart(intent, startId);
}
public class MyBinder extends Binder{
MyService getService(){
return MyService.this;
}
}
}
xml文件
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
最重要的不要忘記注冊,Android的四大組建都需要注冊
以下是demo的運行
這樣程序就可以後台運行了
下面是程序日志幫助大家理解生命周期
前言 在打開愛奇藝等app的歡迎界面的時候,右上角有一個倒計時的控件。倒計時完了以後進入主界面。現在我們來實現這個功能。 方法一:利用ja
項目中需要用到類似公告欄的控件,能用的基本不支持多行顯示,於是只好自己動手,苦於沒有自定義過一個像樣的控件,實現了多行向上滾動的控件。在原控件基礎之上添加如下功能:傳入數
通過對嵌入式企鵝圈原創團隊成員degao之前發表的《Android Small插件化框架源碼分析》的學習,對Android使用的插件化技術有了初步的了解,但還是有很多需要
在上一篇文章-安卓開發環境搭建中,我們創建並啟動了eclipse自帶的安卓模擬器,該模擬器不僅啟動慢,而且在使用過程中的反應速度也是出奇的差,經常出現卡機現象。為了解決這