編輯:關於Android編程
創建一個進程服務.程序第一次運行的時候就創建.不需要界面
要想其他進程能夠跨進程的調用本進程的方法.就得使用跨進程訪問的接口類型.只需將接口中類和方法的修飾符去掉就行.然後把接口類編程aidl類型
服務也業務代碼:
[java]
package com.example.remoteservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
/**
* 跨進程訪問的接口類型:將接口和接口中方法的修飾類型去掉,
* android生成aidl文件步驟:找到編寫的java源文件,將其擴展名該為aidl.然後回到項目
* ,刷新項目,該類就會變為源文件名.aidl的文件,並且系統會自動在gen
* .工程目錄下生成原java文件的名的java文件.可以打開看下內容與之前不一樣了.到此就完成了aidl的創建
*
* @author Administrator
*
*/
public class RemoteService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return new Mybinder();
}
/**
* 可以繼承系統根據自己定義的iservice接口生成iservice.adil之後的IServcice.Stub類,
* Stub是系統自己家上的.該類是個抽象類,繼承了binder類也實現了iservice<br>
*
* @author Administrator
*
*/
public class Mybinder extends IServcice.Stub {
@Override
public void callMethodInService() throws RemoteException {
sayHelloInService();
}
}
/**
* 服務中的方法
*/
public void sayHelloInService() {
System.out.println("hello in service");
}
@Override
public void onCreate() {
System.out.println("remote service create");
}
}
服務進程對外提供調用的接口,將該接口轉成aidl文件,
aidl文件的創建:找到編寫的java源文件,將其擴展名該為aidl.然後回到項目,刷新項目,該類就會變為源文件名.aidl的文件,並且系統會自動在gen .工程目錄下生成原java文件的名的java文件.可以打開看下內容與之前不一樣了.到此就完成了aidl的創建
[html]
package com.example.remoteservice;
interface IServcice {
void callMethodInService();
}
在配置文件application中注冊該服務
[html]
<service android:name=".RemoteService" >
<intent-filter>
<action android:name="com.example.remoteservice" /> <!-- 指定action,可方便別的程序調用 -->
</intent-filter>
</service>
到此被調用的服務就創建好了.如果想對外使用.必須啟動該進程.和服務.所以.為配合下面調用的例子(調用外部進程的服務)必須保證該進程的正常運行.
總結以上調用本進程中服務的方法:
1創建一個服務,該服務中要有能被調用的方法;
2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法 ;
3:定義一個MyBinder對象.繼承binder類,並實現IService接口,在onBind方法中返回MyBinder對象;
4:在activity中通過bindService ()綁定一個服務;
5:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的onServiceConnected()方法;
6:onServiceConnected ()方法的IBinder參數就是IService類型的,強制轉換為IService;
7:調用ISservice中方法
調用外部進程中服務(上面的進程)
訪問其他進程中服務的步驟:
訪問外部服務.要知道對方服務的action,和可以調用服務接口的adil文件以及adil文件的包名.在本地程序創建調用服務的aidl文件的包,並添加(copy)外部服務的aidl文件,系統會自動在gen目錄下創建該adil文件接口java文件
1創建一個服務,該服務中要有能被調用的方法;
2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法,去掉定義接口和接口中方法的修飾符,把這個接口的擴展名該為.aidl,;
3:定義一個MyBinder對象,繼承編譯器根據IService.aidl在gen中創建的IService類中的Sutb類,
在onBind方法中返回MyBinder對象
4:在調用服務的工程中創建包,包名要與被調用服務工程中對應aidl文件所在的包名一樣.並復制被調用工程對應的aidl文件到本地對應aidl文件包中
5:在activity中通過bindService ()綁定一個服務;
6:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的方法;
7:在實現接口中的onServiceConnected()方法調用IServcice.Stub.asInterface()方法.將onServiceConnected的IBinder參數轉換成IService類型;
8:調用IService中的方法(調用服務中的方法),
按照上面步驟創建了同樣的包和copy了被調用的aidl文件之後,創建調用外部進程頁面的布局.本例只以一個button為例
[html]
<Button
android:id="@+id/call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="調用外部服務" />
調用外部服務的代碼實現
[java]
package com.example.callremoteservice;
import com.example.remoteservice.IServcice;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
/**
* 訪問外部服務.要知道對方服務的action,和可以調用服務接口的adil文件以及adil文件的包名<br>
* 在本地程序創建調用服務的adil文件的包,並添加外部服務的adil文件,系統會自動在gen目錄下創建該adil文件接口java文件<br>
* 總結:<br>
* 訪問本進程中的service,需要用到bindService()方法.(cz23_serverlifecycle)<br>
*
* 1創建一個服務,該服務中要有能被調用的方法;<br>
* 2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法 ;<br>
* 3:定義一個MyBinder對象.繼承binder類,並實現IService接口,在onBind方法中返回MyBinder對象;<br>
* 4:在activity中通過bindService ()綁定一個服務;<br>
* 5:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的onServiceConnected()方法;<br>
* 6:onServiceConnected ()方法的IBinder參數就是IService類型的,強制轉換為IService;<br>
* 7:調用ISservice中方法<br>
* <br>
* 訪問 外部進程中的service,需要用到aidl(android interface definition language)(在編號24的兩個例子)<br>
* 1創建一個服務,該服務中要有能被調用的方法;<br>
* 2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法,去掉定義接口和接口中方法的修飾符,把這個接口的擴展名該為.aidl,;<br>
* 3:定義一個MyBinder對象,繼承編譯器根據IService.aidl在gen中創建的IService類中的Sutb類,
* 在onBind方法中返回MyBinder對象<br>
* 4:在調用服務的工程中創建包,包名要與被調用服務工程中對應aidl文件所在的包名一樣.並復制被調用工程對應的aidl文件到本地對應aidl文件包中<br>
* 5:在activity中通過bindService ()綁定一個服務;<br>
* 6:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的方法;<br>
* 7:在實現接口中的onServiceConnected()方法調用IServcice.Stub.asInterface()方法.
* 將onServiceConnected的IBinder參數轉換成IService類型<br>
* 8:調用IService中的方法(調用服務中的方法),
*
* @author Administrator
*
*/
public class MainActivity extends Activity {
private IServcice iServcice;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.example.remoteservice");// 隱式意圖,指定訪問服務的action,就是被調用服務進程值注冊服務的時候指定的action的值
bindService(intent, new MyConn(), Context.BIND_AUTO_CREATE);// 通過隱式意圖綁定到外部服務.參數2是服務綁定成功後的一個回調類.通過他可以獲取外部服務對外提供數據的對象
}
public void click(View view) {
try {
iServcice.callMethodInService();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class MyConn implements ServiceConnection {
@Override
/**
* 參數IBinder就是綁定被調用的服務執行onBind的返回值
*/
public void onServiceConnected(ComponentName arg0, IBinder service) {
iServcice = IServcice.Stub.asInterface(service);// 調用外部進程中service的轉換方法
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
}
}
本節引言: 上節我們寫了關於Xfermode與PorterDuff使用的第一個例子:圓角&圓形圖片ImageView的實現, 我們體會到了
Android的窗口體系中,WindowManager占有非常重要的地位,它封裝了添加、移除、更新窗口的方法,它是Activity、View的更加底層的管理類,使用Win
介紹realm是一個跨平台移動數據庫引擎,支持iOS、OS X(Objective-C和Swift)以及Android。2014年7月發布。由YCombinator孵化的
首先看一張國內Top500 Android應用中它們用到的第三方推送以及所占數量:現在總結下Android平台下幾種推送方案的基本情況以及優缺點:一、使用GCM(Goog