實(shí)時(shí)獲取股票數(shù)據(jù)的android app應(yīng)用程序源碼分享
最近學(xué)習(xí)Android應(yīng)用開發(fā),不知道寫一個(gè)什么樣的程序來練練手,正好最近股票很火,就一個(gè)App來實(shí)時(shí)獲取股票數(shù)據(jù),取名為Mystock。使用開發(fā)工具Android Studio,需要從Android官網(wǎng)下載,下載地址:http://developer.android.com/sdk/index.html。不幸的是Android是Google公司的,任何和Google公司相關(guān)的在國內(nèi)都無法直接訪問,只能通過VPN訪問。
下圖為Android Studio打開一個(gè)工程的截圖:

下面按步介紹Mystock的實(shí)現(xiàn)步驟。
1.以下是activa_main.xml的內(nèi)容。上面一排是三個(gè)TextView,分別用來顯示上證指數(shù),深圳成指,創(chuàng)業(yè)板指。中間一排是一個(gè)EditText和一個(gè)Button,用來添加股票。下面是一個(gè)Table,用來顯示添加的股票列表。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stock_sh_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/stock_sh_index"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:id="@+id/stock_sh_change"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stock_sz_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/stock_sz_index"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:id="@+id/stock_sz_change"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stock_chuang_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/stock_chuang_index"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:id="@+id/stock_chuang_change"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:maxLength="6"
android:id="@+id/editText_stockId"
android:layout_weight="1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_add_label"
android:onClick="addStock" />
</LinearLayout>
<!--ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView" /-->
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/stock_table"></TableLayout>
</ScrollView>
</LinearLayout>
應(yīng)用截圖如下:

2.數(shù)據(jù)獲取,這里使用sina提供的接口來實(shí)時(shí)獲取股票數(shù)據(jù),代碼如下:
public void querySinaStocks(String list){
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://hq.sinajs.cn/list=" + list;
//http://hq.sinajs.cn/list=sh600000,sh600536
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
updateStockListView(sinaResponseToStocks(response));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(stringRequest);
}
這里發(fā)送Http請求用到了Volley,需要在build.gradle里面添加dependencies:compile 'com.mcxiaoke.volley:library:1.0.19'。
3.定時(shí)刷新股票數(shù)據(jù),使用了Timer,每隔兩秒發(fā)送請求獲取數(shù)據(jù),代碼如下:
Timer timer = new Timer("RefreshStocks");
timer.schedule(new TimerTask() {
@Override
public void run() {
refreshStocks();
}
}, 0, 2000);
private void refreshStocks(){
String ids = "";
for (String id : StockIds_){
ids += id;
ids += ",";
}
querySinaStocks(ids);
}
4.在程序退出時(shí)存儲(chǔ)股票代碼,下次打開App時(shí),可以顯示上次的股票列表。代碼如下。
private void saveStocksToPreferences(){
String ids = "";
for (String id : StockIds_){
ids += id;
ids += ",";
}
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(StockIdsKey_, ids);
editor.commit();
}
@Override
public void onDestroy() {
super.onDestroy(); // Always call the superclass
saveStocksToPreferences();
}
5.刪除選中的股票,在menu_main.xml里面添加一個(gè)action。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
<item android:id="@+id/action_settings" android:title="@string/action_settings"
android:orderInCategory="100" app:showAsAction="never" />
<item android:id="@+id/action_delete" android:title="@string/action_delete"
android:orderInCategory="100" app:showAsAction="never" />
</menu>
代碼響應(yīng)事件并刪除:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
else if(id == R.id.action_delete){
if(SelectedStockItems_.isEmpty())
return true;
for (String selectedId : SelectedStockItems_){
StockIds_.remove(selectedId);
TableLayout table = (TableLayout)findViewById(R.id.stock_table);
int count = table.getChildCount();
for (int i = 1; i < count; i++){
TableRow row = (TableRow)table.getChildAt(i);
LinearLayout nameId = (LinearLayout)row.getChildAt(0);
TextView idText = (TextView)nameId.getChildAt(1);
if(idText != null && idText.getText().toString() == selectedId){
table.removeView(row);
break;
}
}
}
SelectedStockItems_.clear();
}
return super.onOptionsItemSelected(item);
}
屏幕截圖:

6.當(dāng)有大額委托掛單時(shí),發(fā)送消息提醒,代碼如下:
{
...
String text = "";
String sBuy = getResources().getString(R.string.stock_buy);
String sSell = getResources().getString(R.string.stock_sell);
if(Double.parseDouble(stock.b1_ )>= StockLargeTrade_) {
text += sBuy + "1:" + stock.b1_ + ",";
}
if(Double.parseDouble(stock.b2_ )>= StockLargeTrade_) {
text += sBuy + "2:" + stock.b2_ + ",";
}
if(Double.parseDouble(stock.b3_ )>= StockLargeTrade_) {
text += sBuy + "3:" + stock.b3_ + ",";
}
if(Double.parseDouble(stock.b4_ )>= StockLargeTrade_) {
text += sBuy + "4:" + stock.b4_ + ",";
}
if(Double.parseDouble(stock.b5_ )>= StockLargeTrade_) {
text += sBuy + "5:" + stock.b5_ + ",";
}
if(Double.parseDouble(stock.s1_ )>= StockLargeTrade_) {
text += sSell + "1:" + stock.s1_ + ",";
}
if(Double.parseDouble(stock.s2_ )>= StockLargeTrade_) {
text += sSell + "2:" + stock.s2_ + ",";
}
if(Double.parseDouble(stock.s3_ )>= StockLargeTrade_) {
text += sSell + "3:" + stock.s3_ + ",";
}
if(Double.parseDouble(stock.s4_ )>= StockLargeTrade_) {
text += sSell + "4:" + stock.s4_ + ",";
}
if(Double.parseDouble(stock.s5_ )>= StockLargeTrade_) {
text += sSell + "5:" + stock.s5_ + ",";
}
if(text.length() > 0)
sendNotifation(Integer.parseInt(sid), stock.name_, text);
...
}
public void sendNotifation(int id, String title, String text){
NotificationCompat.Builder nBuilder =
new NotificationCompat.Builder(this);
nBuilder.setSmallIcon(R.drawable.ic_launcher);
nBuilder.setContentTitle(title);
nBuilder.setContentText(text);
nBuilder.setVibrate(new long[]{100, 100, 100});
nBuilder.setLights(Color.RED, 1000, 1000);
NotificationManager notifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notifyMgr.notify(id, nBuilder.build());
}
屏幕截圖:

以上通過圖文并茂的方式給大家分享了一個(gè)實(shí)時(shí)獲取股票數(shù)據(jù)的android app應(yīng)用程序源碼,希望大家喜歡。
- Android獲取app應(yīng)用程序大小的方法
- Android編程之高效開發(fā)App的10個(gè)建議
- 使用Chrome瀏覽器調(diào)試Android App詳解
- Android中通過外部程序啟動(dòng)App的三種方法
- Android 應(yīng)用APP加入聊天功能
- Android App后臺(tái)服務(wù)報(bào)告工作狀態(tài)實(shí)例
- 一看就懂的Android APP開發(fā)入門教程
- Android App數(shù)據(jù)格式Json解析方法和常見問題
- android使用webwiew載入頁面使用示例(Hybrid App開發(fā))
- Android編程判斷當(dāng)前指定App是否在前臺(tái)的方法
相關(guān)文章
Android和iOS 測試五個(gè)最好的開源自動(dòng)化工具
本文主要介紹Android和iOS 五個(gè)最好的開源自動(dòng)化工具,這里整理了相關(guān)資料,希望能幫助測試軟件的朋友,有需要的看下2016-09-09
Android 出現(xiàn)的警告(Service Intent must be explicit)解決辦法詳解
這篇文章主要介紹了Android 出現(xiàn)的警告(Service Intent must be explicit)解決辦法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android中實(shí)現(xiàn)在矩形框中輸入文字顯示剩余字?jǐn)?shù)的功能
在矩形輸入框框中輸入文字顯示剩余字?jǐn)?shù)的功能在app開發(fā)中經(jīng)常會(huì)見到,今天小編就通過實(shí)例代碼給大家分享android實(shí)現(xiàn)輸入框提示剩余字?jǐn)?shù)功能,代碼簡單易懂,需要的朋友參考下吧2017-04-04
Android實(shí)現(xiàn)短信發(fā)送功能
這篇文章主要介紹了Android實(shí)現(xiàn)短信發(fā)送功能,對Android實(shí)現(xiàn)短信發(fā)送的每一步都進(jìn)行了詳細(xì)的介紹,感興趣的小伙伴們可以參考一下2015-12-12
Android開發(fā) 旋轉(zhuǎn)屏幕導(dǎo)致Activity重建解決方法
Android開發(fā)文檔上專門有一小節(jié)解釋這個(gè)問題。簡單來說,Activity是負(fù)責(zé)與用戶交互的最主要機(jī)制,接下來為您詳細(xì)介紹2012-11-11
Android實(shí)現(xiàn)滑動(dòng)標(biāo)簽頁
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)滑動(dòng)標(biāo)簽頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04

