androidjava服務
1. 學java和android哪個就業前景好
相對於前景,我們的學習更應該側重於興趣。學習自己感興趣的語言,做自己感興趣的工作,往往能夠事半功倍。其實兩門語言你只要精通任意一種都不愁好工作。
其實Android是基於Java延伸出來的,相比之下Java涉及的面更廣一點,如果非要為了發展而學習,從目前的情況來看,Android處於飽和狀態。Android的崗位較少而且就業要求偏高,都要好幾年的開發經驗;而java的話一直以來都是很穩定的,就業情況一致以來都是領先,自16年以來Java一直保持著編程語言排行榜首位。從ITjob的就業情況能看出Java的需求量一直很大!
如果想要學得好,學的精,最短時間內學習成果最大化,就業效果做佳化,建議培訓。
題主可以去招聘網站上看一下招聘情況。希望這篇回答能夠幫到你,祝好~
2. android客戶端如何與後台java伺服器交互
1、java伺服器建立至少一種服務webservices、servlet、socket
2、客戶端通過socket或者httpurlconnection的方式進行連接訪問
服務端:
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
//TODOAuto-generatedmethodstub
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriterout=resp.getWriter();
//用HTML格式給瀏覽器返回數據
out.println("<html>");
out.println("<head>");
out.println("<title>TomcatServlet測試</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello,FirstServlet!");
out.println("</body>");
out.println("</html>");
out.println("Hello,第一個Tomcat!!!");
out.close();
}
客戶端:
privateStringdoGet(Stringurl){
StringresponseStr="";
try{
Stringname=nameEdit.getText().toString().trim();
Stringcode=codeEdit.getText().toString().trim();
StringgetUrl=URL+"?NAME="+name+"&"+"CODE="+code;
HttpGethttpRequest=newHttpGet(getUrl);
HttpParamsparams=newBasicHttpParams();
ConnManagerParams.setTimeout(params,1000);
HttpConnectionParams.setConnectionTimeout(params,3000);
HttpConnectionParams.setSoTimeout(params,5000);
httpRequest.setParams(params);
HttpResponsehttpResponse=newDefaultHttpClient().execute(httpRequest);
finalintret=httpResponse.getStatusLine().getStatusCode();
if(ret==HttpStatus.SC_OK){
responseStr=EntityUtils.toString(httpResponse.getEntity(),HTTP.UTF_8);
}else{
responseStr="-1";
}
}catch(ClientProtocolExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnresponseStr;
}
詳細的參見:http://blog.csdn.net/yanzi1225627/article/details/24882569
3. 如何在Android源碼中加入Java層系統服務
1. 在android/app/目錄下創建介面文件IServiceTest.aidl
package android.app;
oneway interface IServiceTest
{
void show();
}
2. 在Android.mk文件中的變數LOCAL_SRC_FILES中加入core/java/android/app/IServiceTest.aidl
如果要在sdk中發布這個服務就在變數aidl_files中加入一樣的路徑。
3. 通過aidl編譯器編譯IServiceTest.aidl,會生成一個IServiceTest.java文件。
4. 創建服務類ServiceTestSerice
class ServiceTestSerice extends IServiceTest.Stub{
private static final String TAG = 「ServiceTestSerice」;
Context mContext;
public ServiceTestSerice(Context context){
mContext = context;
}
public void show() throws RemoteException {
System.out.println(「My ServiceTestSerice」);
}
}
.5. 注冊服務
Java系統服務在ServerThread類的run()方法中生成並注冊到android平台,生成ServiceTestSerice實例對象,通過ServiceManager的addService方法將服務注冊到系統中。
try{
serviceTestSerice = new ServiceTestSerice(context);
ServiceManager.addService(Context.SERVICE_TEST, serviceTestSerice);
} catch (Throwable t) {
}
ServiceTestSerice serviceTestSerice;
以上代碼在ServerThread類的run()方法中。
在Context類中加入:
public static final StringSERVICE_TEST = 「servicetest」
ServiceTestManager sServiceTestManager;
6. 使用系統服務
編寫一個ServiceTestManager類,為包裝類。
public class ServiceTestManager{
private final IServiceTest mService;
ServiceTestManager(IServiceTest service){
mService = service;
}
public void test(){
try{
mService. show()
} catch (RemoteException ex){
}
}
}
7 提供應用層開發介面
在ContextImpl類中的getSystemService()方法中加入如下代碼:
else if (SERVICE_TEST.equals(name)){
return getServiceTestManager();
}
private ServiceTestManager getServiceTestManager(){
synchronized(sSync) {
if (sServiceTestManager == null){
IBinder b = ServiceManager.getService(SERVICE_TEST);
IServiceTest service = IServiceTest.Stub.asInterface(b);
sServiceTestManager = new ServiceTestManager(service);
}
}
調用過程如下:
ServiceTestManager manager= (ServiceTestManager) getSystemService(Context. SERVICE_TEST);
manager.show();
8. 測試
make
make update-api 更新current.xml文件
生成system.imz文件,放到<ANDROID_SDK>/platform/android-20/images/目錄下,
adb shell
service list
4. Java和Android學哪個好
Android和JAVA區別:
Android是主流智能手機的操作系統,JAVA是一種開發語言,兩者沒有好壞優勢之分,只是兩種職業崗位選擇,學安卓從事移動互聯方向開發,學JAVA從事軟體方向開發,主要看個人選擇,從學JAVA轉移到安卓,學安卓轉移到JAVA都是可以的。完美空間認為:從職業角度出發,想要快速從事軟體行業的開發,對大多數計算機不好的人員,安卓Android開發是最合適的選擇。
從整體來講,java和android的區別在於android程序是基於組件和配置的,而且android開發以java語言為開發工具,表面上看他們有點同宗不同門,但實際上區別十分大,android是一個主流智能手機操作系統,java是一種開發語言,兩者沒有好壞之分,而且兩者也是不同的崗位,從工作崗位來看,安卓從事的是移動互聯方向,java則是從事開發方向。
java和android都是可以做手機開發的;在以前半智能機的時代,手機應用的最多的就是java、塞班操作系統了,這兩個操作系統在三年以前應該和今天的安卓、IOS系統差不多,當時認為很完美了,不過時至今日,java系統相對較少,隨著3G時代的到來,人們最重要的網路終端設備一定是手機,而移動終端設備中3G系統的android手機又最多,android手機又以java為基礎,所以二者都可以說能做手機開發。
現在安卓能占智能系統的50%左右的市場份額,當然智能系統或者是移動終端不僅僅是指手機,因為從android3.0以後就開始應用於平板電腦了,android也是在快速的發展,從目前勢頭上來看,好像android要略勝一籌,但是其實這兩者並沒有可比性,因為發展方向並不一樣,側重點也不一樣,java按照實際的開發產品來看,至少有三個方向可以發展;手機終端、電腦客戶端、web伺服器斷,而android只適用於手機終端,因此java的發展范圍相對要廣一些,也就是我們所說的工作崗位更多一些,而android范圍小一些,但是從待遇上來看普遍稍高,各有各的好處,再說學習來看,從android轉java和從java轉android都是可以的,不管哪個行業都存在金字塔頂端的人,如果做好的話兩者都是不錯的方向。
5. android客戶端如何與後台java伺服器交互
php做前端,java做後端淘寶是個例子伺服器端前後分開是為了兩方面,雖然淘寶最開始並不想這樣做。。。先說下歷史,淘寶是最開始php全部,後來發現開銷太大,代碼效率不行,就直接把數據存儲啊,用戶通知啊就交給java實際上大部分網站都樂意採用這種前端php後端java或者c++這種形式,我是phpc++這種。優點,核心動作效率肯定高,c++java這種代碼效率奇高。比php腳本好很多。前端php,語法簡單,維護簡單,部署簡單,而且容易找到維護人員。總之就是開發快,維護成本低。大致了解了嗎?你說的h5+java實際上就是把java提到前台,不是不可以,維護和開發成本太高了啊。前端開發要經常搞,但是java做前台要調試、編譯部署還要重編譯。麻煩,人工開銷也大。不劃算如果是.net技術就更高成本了。光伺服器軟體一塊就要多少了。所以微軟的框架用的不多。國內外都不多,用.met的成本開發維護都麻煩。要氣硬體條件還苛刻。
6. JAVA服務端android客戶端如何通信
一、HTTP請求(APACHE的HttpClient實現)
伺服器端,就是普通的servlet、Strutus2就可以
移動端
protected static String get(String url, List<NameValuePair> params) {
String resultMsg;
// 設置http請求配置
HttpParams parms = new BasicHttpParams();
parms.setParameter("charset", HTTP.UTF_8);
// 配置連接超時
HttpConnectionParams.setConnectionTimeout(parms, 10 * 1000);
// 設置請求超時
HttpConnectionParams.setSoTimeout(parms, 15 * 1000);
// 實例化HttpClient
HttpClient httpclient = new DefaultHttpClient(parms);
// 實例化HttpGet
HttpGet httpget = new HttpGet(url);
// 設置請求頭
httpget.addHeader("Content-Type", "application/json");
httpget.addHeader("charset", HTTP.UTF_8);
try {
if (params.size() > 0)
url = url + "?" + URLEncodedUtils.format(params, HTTP.UTF_8);
HttpResponse resp = httpclient.execute(httpget);
int statusCode = resp.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
StringBuffer result = getResponse(resp);
resultMsg = result.toString();
} else {
resultMsg = "連接異常";
}
} catch (Exception e) {
resultMsg = "連接異常";
} finally {
// 關閉get
httpget.abort();
// 關閉連接 ,釋放資源
httpclient.getConnectionManager().shutdown();
}
return resultMsg;
}
protected static String post(String uri, Object params) {
String resultMsg;
// 設置http請求配置
HttpParams hp = new BasicHttpParams();
hp.setParameter("charset", HTTP.UTF_8);
// 配置連接超時
HttpConnectionParams.setConnectionTimeout(hp, 10 * 1000);
HttpConnectionParams.setSoTimeout(hp, 15 * 1000);
// 實例化HttpClient
HttpClient httpclient = new DefaultHttpClient(hp);
// 實例化HttpPost請求
HttpPost httppost = new HttpPost(uri);
// 設置頭信息
httppost.addHeader("Content-Type", "application/json");
httppost.addHeader("charset", HTTP.UTF_8);
try {
// 將參數進行json化
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(params);
Log.i(TAG, "URI=" + uri + ",BEAN=" + jsonStr);
// 定義消息實體
StringEntity se = new StringEntity(jsonStr, HTTP.UTF_8);
httppost.setEntity(se);
// 通信
HttpResponse resp = httpclient.execute(httppost);
int statusCode = resp.getStatusLine().getStatusCode();
Log.i(TAG, "StatusCode=" + statusCode);
if (statusCode == HttpStatus.SC_OK) {
StringBuffer result = getResponse(resp);
resultMsg = result.toString();
} else {
resultMsg = "連接異常";
}
} catch (Exception e) {
e.printStackTrace();
resultMsg = "連接異常";
} finally {
// 關閉get
httppost.abort();
// 關閉連接 ,釋放資源
httpclient.getConnectionManager().shutdown();
}
Log.i(TAG, resultMsg);
return resultMsg;
}
二、SOCKET連接
伺服器端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class service_java_test {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(10000); //綁定的埠號
Socket socket = server.accept(); //連接不成功以至於下一行的"連接成功"
//在調試區顯示不出來
System.out.println("連接成功");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
while (true) {
String msg = in.readLine();
System.out.println(msg);
out.println("Server received " + msg); //向接收方發送已接受到了的語句
out.flush();
if (msg.equals("bye")) { //若接收到"bye"則break
break;
}
}
socket.close();
}
}
安卓客戶端:
package com.example.t4_android;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView myTextView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTextView = (TextView) findViewById(R.id.textView1);
Thread t = new Thread(new Runnable(){
public void run(){
try {
Socket sk = new Socket("192.168.253.1", 10000);//綁定套接字,這一行一直執行不成功
//以至於下一行在安卓頁面的TextView上
//不顯示「已連接」的字樣
//"192.168.253.1"是我利用DOS命令查找
//的本機IP
myTextView.setText("已連接");
} catch (Exception e) {
e.printStackTrace();
}
}
});
t.start();
}
}
7. 新手用Java怎麼做簡單後天安卓系統
使用J2EE技術或者叫JavaWeb技術開發一個Web伺服器,伺服器返回Json數據,android客戶端解析json數據,使用http協議和伺服器通信,android有相應模塊和API。首先樓主得懂Java後台也就是JavaEE,用Servlet搭建Web服務,Serlvet映射一個URL,Android請求這個URL,Servlet處理請求,然後就是Java編程,Web分層、JDBC等技術。伺服器返回標準的JSON輕量數據(就是純文本),Android來解析。
具體技術:(1)JavaServlet作為Web服務的處理入口;(2)Java編程編寫業務處理程序;(3)JDBC訪問資料庫;(4)Android端的HTTP模塊,API;(5)Android端解析JSON數據;(6)Servlet或者Java端生成JSON數據;
等樓主技術強了,就可以接觸各種框架、EJB技術了。Spring、SpringMVC、Struts、Hibernate,甚至NOSQL、分布式、負載、node.js、模板技術等等。
8. 如何部署android伺服器端的java代碼
Java平台般三版本:Java ME(微型版用於某些手機)、Java SE(標准版用於台式電腦)、Java EE(企業版用於伺服器端應用)談Java我通指Java SE版本包含虛擬機編譯器
首先Java代碼編譯稱位元組碼間格式位元組碼目標電腦運行虛擬機快速解析目標電腦硬體操作系統所需要本機格式
除發者提供編寫處運行優勢Java能通垃圾收器(GC)實現自內存管理發者免手代碼釋放用象內存雖功能非用且降低代碼引入內存問題風險增加運行銷需要停執行垃圾收進程
本文比較Java SE用於Android發Java間差異首先我介紹發者習慣Java
SE語言結構及何Android運行其我介紹何優化AndroidJava代碼何優化內存配及何恰處理線程
比較AndroidDalvik JavaJava SE
雖遠Android現前發者能用Java編程語言移設備編寫應用程序Java功能極限版本稱Java
ME(微型版)同移設備需編寫同代碼寫應用程序能支持Java
ME任何手機運行幾乎能外由於存線商店應用發布程極其復雜
Android問世發者提供構建智能手機強應用機發者需用Java編程語言及熟知標准Java
API編寫代碼盡管Android發者仍使用Java SE編譯器編譯應用程序發現James
Gosling發JavaAndroid設備Java存許同處
Android設備運行VM(虛擬機)稱Dalvik初由谷歌Dan
Bornstein發適用於CPU內存受限移設備Java SEDalvik Java存些差異主要體現虛擬機Java
SE使用棧機設計Dalvik設計基於寄存器機器Android SDKdx工具Java
SE棧機器位元組碼轉換基於寄存器Dalvik機器位元組碼該轉換步驟由IDE自完
基於棧虛擬機基於寄存器虛擬機定義及差異列入我討論范圍由於歷史原Android使用基於寄存器虛擬機雖基於寄存器虛擬機比基於棧虛擬機快32%限於執行解釋位元組碼虛擬機(說解釋型虛擬機)Android
2.2版本(稱Froyo)前Dalvik虛擬機都純解釋型Froyo版本引入JIT編譯器(即編譯)Java
SE早優勢
JIT編譯稱態翻譯執行前位元組碼翻譯本機代碼(圖1所示)主要兩處首先消除些純解釋型虛擬機銷;其能本機代碼執行優化通靜態編譯代碼做例JIT編譯器運行CPU選擇合適優化根據應用程序輸入析代碼何運行便進行步優化
圖1Android JavaJava SE翻譯步驟
雖AndroidDalvik JIT編譯器發展前景要達Java SEJIT編譯器般穩定、熟度尚需段間Dalvik JIT現Android提供巨性能優勢且斷改善
JAVA
SE虛擬機Dalvik虛擬機另區別者進行優化運行同機器實例機啟叫做zygote進程該進程創建第Dalvik實例由實例創建所其實例應用程序啟zygote進程收創建新虛擬機實例請求並給該應用程序創建新進程(圖2所示)發者已習慣於Java
SE發設計能看起切實際優勢避免由應用程序運行失敗導致Dalvik虛擬機崩潰繼引發應用程序崩潰
圖2Android啟新Dalvik虛擬機實例
AndroidJava
SE除運行虛擬機同外實現API式Android屬於javajavax包API都自Apache
Harmony(源項目旨重新實現Java SE軟體棧該項目201111月再維護)發面些APIJava
SE包類似存些差別例谷歌HttpUrlConnection類進行Java SE版本所沒重升級
外Android平台移除Java
SE關API例Swing/AWT包完全移除Android使用同UI框架其移除APIRMI、CORBA、ImageIOJMX或者替換特定Android版本(android包空間內)或者些實際原根本存
優化AndroidJava代碼
經改進Java
SE具備些簡化編寫復雜代碼結構新特性其些特性讓整流程變更簡單發者需要解何及何確使用另外由於Java
SE用於伺服器端發(使用Java企業版API)發員專門伺服器端Java代碼進行優化註解Java虛擬機腳本語言支持伺服器端發進行優化例證雖些工具構建端發強發Android客戶端代碼些特性作用甚至起反作用Java發者已經習慣於限量RAMCPUAndroid發需要密切關注性能內存配簡單說發者需要使用稍微同待Android端發
隨著Android首發布情況所改變曾經些Android盡量用Java規范重新推薦主要Android目前JIT編譯器解決些規范導致性能問題
本文討論編寫Android應用程序需要解Java代碼我深究Java編程語言細節重點關注Android發重要東西發者仍需解數適用於Java SE規則建議同適用於AndroidDalvik虛擬機
Android類型安全枚舉
Java SE 5.0新增許便發者新特性其值期待引入類型安全枚舉枚舉代碼用表示屬於某組幾選擇早期版本Java用整型量解決問題雖技術行容易錯請看面代碼:
public class Machine {
public static final int STOPPED = 10;
public static final int INITIALIZING = 20;
public static final int STARTING = 30;
public static final int RUNNING = 40;
public static final int STOPPING = 50;
public static final int CRASHED = 60;
private int mState;
public Machine() {
mState = STOPPED;
}
public int getState() {
return mState;
}
public void setState(int state) {
mState = state;
}
}
問題雖些量期望沒機制保證setState()接收同值要設置添加檢查旦非預期值發者需要處理錯誤發者所需要編譯檢查非賦值類型安全枚舉解決問題所示:
public class Machine {
public enum State {
STOPPED, INITIALIZING, STARTING, RUNNING, STOPPING, CRASHED
}
private State mState;
public Machine() {
mState = State.STOPPED;
}
public State getState() {
return mState;
}
public void setState(State state) {
mState = state;
}
}
注意聲明同類型安全值新加內部枚舉類編譯解決非賦值問題所代碼更容易錯
Dalvik虛擬機沒JIT編譯器優化代碼建議Android平台使用枚舉類型使用整型量相比種設計帶內存性能損失更些版本Android
API存整型量原今更強JIT編譯器及斷改進Dalvik虛擬機發者必再擔問題放膽使用類型安全枚舉即
仍存些情況使用整型量更選擇像intJava基本類型增加GC銷外Android SDK許已API仍依賴基本類型比Handler類——種情況沒太選擇
Android增強版for循環
Java SE 5.0引入增強版for循環提供通用縮寫表達式遍歷集合數組首先比較五種:
void loopOne(String[] names) {
int size = names.length;
for (int i = 0; i < size; i++) {
printName(names[i]);
}
}
void loopTwo(String[] names) {
for (String name : names) {
printName(name);
}
}
void loopThree(Collection names) {
for (String name : names) {
printName(name);
}
}
void loopFour(Collection names) {
Iterator iterator = names.iterator();
while (iterator.hasNext()) {
printName(iterator.next());
}
}
// 要ArrayList使用增強版for循環
void loopFive(ArrayList names) {
int size = names.size();
for (int i = 0; i < size; i++) {
printName(names.get(i));
}
}
面顯示四種同遍歷集合數組式前面兩種著相同性能所讀取元素放數組使用增強版for循環Collection象說增強版for循環使用迭代器遍歷元素著相同性能ArrayList象應避免使用增強版for循環
僅需要遍歷元素且需要元素位置定要使用數組或者ArrayList所其Collection類些情況更慢
般情況讀取元素幾乎變數據集性能要求高建議使用規數組數組固定添加數據影響性能所編寫代碼要考慮所素
隊列、同步鎖
通情況應用程序線程產數據另線程使用見例線程獲取網路數據另線程(操作UI主線程)些數據展現給用戶種模式稱產者/消費者模式面向象編程課程發者用算實現該模式能要花幾面介紹些簡化產者/消費者模式實現現類
1. 更智能隊列
雖已現類並能用更少代碼實現該功能許Java發者仍選擇使用LinkedList及同步塊實現隊列功能發者java.util.concurrent包找同步相關類外本包包含信號量、鎖及單變數進行原操作類考慮面使用標准LinkedList實現線程安全隊列代碼
public class ThreadSafeQueue {
private LinkedList mList = new LinkedList();
private final Object mLock = new Object();
public void offer(String value) {
synchronized (mLock) {
mList.offer(value);
mLock.notifyAll();
}
}
public synchronized String poll() {
synchronized (mLock) {
while (mList.isEmpty()) {
try {
mLock.wait();
} catch (InterruptedException e) {
//簡潔起見忽略異處理
}
}
return mList.poll();
}
}
}
雖段代碼確並能考試滿實現測試段代碼浪費間實際所前面代碼用面行代替
LinkedBlockingQueue blockingQueue =
new LinkedBlockingQueue();
面行代碼能像前面例提供相同類型阻塞隊列甚至能提供額外線程安全操作java.util.concurrent包含許選隊列及並發映射類所般情況建議使用像前示例使用更代碼
2. 更智能鎖
Java提供synchronized關鍵字允許發者創建線程安全代碼塊synchronized關鍵字易於使用容易濫用性能造負面影響需要區讀數據寫數據synchronized關鍵字並效幸java.util.concurrent.locks包工具類種情況提供支持
public class ReadWriteLockDemo {
private final ReentrantReadWriteLock mLock;
private String mName;
private int mAge;
private String mAddress;
public ReadWriteLockDemo() {
mLock = new ReentrantReadWriteLock();
}
public void setPersonData(String name, int age, String address) {
ReentrantReadWriteLock.WriteLock writeLock = mLock.writeLock();
try {
writeLock.lock();
mName = name;
mAge = age;
mAddress = address;
} finally {
writeLock.unlock();
}
}
public String getName() {
ReentrantReadWriteLock.ReadLock readLock = mLock.readLock();
try {
readLock.lock();
return mName;
} finally {
readLock.unlock();
}
}
// 重復代碼再贅述
}
面代碼展示使用ReentrantReadWriteLock允許並發線程數據進行讀訪問並確保同間線程寫入相同數據
代碼使用synchronized關鍵字仍處理鎖問題效論何種情況都要考慮ReentrantReadWriteLock否