編輯:關於Android編程
Service與Activity的區別在於:Service一直在後台運行,他沒有用戶界面,絕不會到前台來。
一,創建和配置Service
開發Service需要兩個步驟:1,繼承Service子類,2,在Manifest.xml文件中配置Service
Service中的方法:
public class FirstService extends Service
{
// 必須實現的方法,返回一個IBinder對象,應用程序可通過該對象與Service組件通信
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
// Service被創建時回調該方法。
@Override
public void onCreate()
{
super.onCreate();
System.out.println("Service is Created");
}
// Service被啟動時回調該方法
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
System.out.println("Service is Started");
return START_STICKY;
}
// Service被關閉之前回調。
@Override
public void onDestroy()
{
super.onDestroy();
System.out.println("Service is Destroyed");
}
}
Manifest.xml中配置service
二,啟動和停止Service
1,startService 啟動的服務:主要用於啟動一個服務執行後台任務,不進行通信,訪問者與Service沒有關聯,即使訪問者退出了,Service仍然運行。停止服務使用stopService
bindService 啟動的服務:該方法啟動的服務要進行通信。停止服務使用unbindService
public class StartServiceTest extends Activity
{
Button start, stop;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲取程序界面中的start、stop兩個按鈕
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
// 創建啟動Service的Intent
final Intent intent = new Intent();
// 為Intent設置Action屬性
intent.setAction("org.service.FIRST_SERVICE");
start.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 啟動指定Serivce
startService(intent);
}
});
stop.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 停止指定Serivce
stopService(intent);
}
});
}
2,綁定本地Service並與之通信
如果訪問者和Service之間需要進行方法調用或者數據傳遞,則應該使用bindService和unbindService方法啟動關閉Service
boolean bindService(Intent service, ServiceConnection conn,int flags)方法:
service:這個參數通過Intent指定要啟動的Service
conn:ServiceConnection 對象,該對象用於監聽訪問者與Service之間的連接情況。當訪問者與Service之間連接成功時將會回調ServiceConnection對象的onServiceConnected(ComponentName name, IBinder service);當Service所在的宿主中止,導致Service與訪問者之間斷開時會回調ServiceConnection對象的onServiceDisconnected(ComponentName name)方法
flags:綁定時是否自動創建Service。0或BIND_AUTO_CREATE
ServiceConnection對象的onServiceConnected方法中有一個IBinder對象,該對象即可與被綁定Service之間的通信
通信原理:當開發Service是。該Service類必須提供一個IBinder onBind(Intent intent)方法,在綁定本地Service的情況下,onBind(Intent intent)方法所返回的IBinder對象會傳給ServiceConnection對象的onServiceConnected的(ComponentName name, IBinder service)的service參數。這樣訪問者就可使用該IBinder對象與Service進行通信了
BindService.java
public class BindService extends Service//繼承Service
{
private int count;
private boolean quit;
// 定義onBinder方法所返回的對象,此binder會傳給訪問者
private MyBinder binder = new MyBinder();
// 通過繼承Binder來實現IBinder類
public class MyBinder extends Binder //①
{
public int getCount()
{
// 獲取Service的運行狀態:count
return count;
}
}
// 必須實現的方法,綁定該Service時回調該方法
@Override
public IBinder onBind(Intent intent)
{
System.out.println("Service is Binded");
// 返回IBinder對象
return binder;
}
// Service被創建時回調該方法。
@Override
public void onCreate()
{
super.onCreate();
System.out.println("Service is Created");
// 啟動一條線程、動態地修改count狀態值
new Thread()
{
@Override
public void run()
{
while (!quit)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
count++;
}
}
}.start();
}
// Service被斷開連接時回調該方法
@Override
public boolean onUnbind(Intent intent)
{
System.out.println("Service is Unbinded");
return true;
}
// Service被關閉之前回調該方法。
@Override
public void onDestroy()
{
super.onDestroy();
this.quit = true;
System.out.println("Service is Destroyed");
}
}
配置Service組件:
public class BindServiceTest extends Activity
{
Button bind, unbind, getServiceStatus;
// 保持所啟動的Service的IBinder對象
BindService.MyBinder binder;
// 定義一個ServiceConnection對象
private ServiceConnection conn = new ServiceConnection()
{
// 當該Activity與Service連接成功時回調該方法
@Override
public void onServiceConnected(ComponentName name
, IBinder service)
{
System.out.println("--Service Connected--");
// 獲取Service的onBind方法所返回的MyBinder對象
binder = (BindService.MyBinder) service; //①
}
// 當該Activity與Service斷開連接時回調該方法
@Override
public void onServiceDisconnected(ComponentName name)
{
System.out.println("--Service Disconnected--");
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲取程序界面中的start、stop、getServiceStatus按鈕
bind = (Button) findViewById(R.id.bind);
unbind = (Button) findViewById(R.id.unbind);
getServiceStatus = (Button) findViewById(R.id.getServiceStatus);
// 創建啟動Service的Intent
final Intent intent = new Intent();
// 為Intent設置Action屬性
intent.setAction("org.crazyit.service.BIND_SERVICE");
bind.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 綁定指定Serivce
bindService(intent, conn, Service.BIND_AUTO_CREATE);
}
});
unbind.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 解除綁定Serivce
unbindService(conn);
}
});
getServiceStatus.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 獲取、並顯示Service的count值
Toast.makeText(BindServiceTest.this,
"Serivce的count值為:" + binder.getCount(),
Toast.LENGTH_SHORT).show(); //②
}
});
}
}
2 微信開發者中心
微信公眾號開發者中心提供了使用代碼開發微信微應用的功能,使用代碼開發微應用需要用到服務器,以存放編寫的代碼,因此我們需要一個服務器。那麼在微信那裡設置服務器呢?在微信公眾
Android開發本地及網絡Mp3音樂播放器(十三)網絡音樂搜索功能實現,歌名歌手專輯名搜索
實現功能:實現網絡音樂搜索功能使用觀察者設計模式使用URLEncoder.encode轉碼SearchMusicUtils是重點實現效果如圖:實現代碼如下:NetMusi
Android自定義ViewGroup打造各種風格的SlidingMenu
上篇給大家介紹QQ5.0側滑菜單的視頻課程,對於側滑的時的動畫效果的實現有了新的認識,似乎打通了任督二脈,目前可以實現任意效果的側滑菜單了,感謝鴻洋大大!!用的是Hori
android事件分發
事件分發在Android中非常重要,在滑動沖突,下拉刷新,嵌套滑動的時候都需要非常清楚事件分發的機制,才能寫好對應的處理代碼。曾經以為我對事件分發已經很清楚了,也寫過幾篇