最近学习android应用开发,不知道写一个什么样的程序来练练手,正好最近股票很火,就一个app来实时获取股票数据,取名为mystock。使用开发工具android studio,需要从android官网下载,下载地址:http://developer.android.com/sdk/index.html。不幸的是android是google公司的,任何和google公司相关的在国内都无法直接访问,只能通过vpn访问。
下图为android studio打开一个工程的截图:
下面按步介绍mystock的实现步骤。
1.以下是activa_main.xml的内容。上面一排是三个textview,分别用来显示上证指数,深圳成指,创业板指。中间一排是一个edittext和一个button,用来添加股票。下面是一个table,用来显示添加的股票列表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
<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> |
应用截图如下:
2.数据获取,这里使用sina提供的接口来实时获取股票数据,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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); } |
这里发送http请求用到了volley,需要在build.gradle里面添加dependencies:compile 'com.mcxiaoke.volley:library:1.0.19'。
3.定时刷新股票数据,使用了timer,每隔两秒发送请求获取数据,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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.在程序退出时存储股票代码,下次打开app时,可以显示上次的股票列表。代码如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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里面添加一个action。
1
2
3
4
5
6
7
8
|
<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> |
代码响应事件并删除:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
@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.当有大额委托挂单时,发送消息提醒,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
{ ... 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()); } |
屏幕截图:
以上通过图文并茂的方式给大家分享了一个实时获取股票数据的android app应用程序源码,希望大家喜欢。