实时获取股票数据的android app应用程序源码分享

时间:2022-10-05 22:59:09

最近学习android应用开发,不知道写一个什么样的程序来练练手,正好最近股票很火,就一个app来实时获取股票数据,取名为mystock。使用开发工具android studio,需要从android官网下载,下载地址:http://developer.android.com/sdk/index.html。不幸的是android是google公司的,任何和google公司相关的在国内都无法直接访问,只能通过vpn访问。

下图为android studio打开一个工程的截图:

 实时获取股票数据的android app应用程序源码分享

下面按步介绍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>

应用截图如下:

 实时获取股票数据的android app应用程序源码分享

 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);
 }

屏幕截图:

 实时获取股票数据的android app应用程序源码分享

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应用程序源码分享

以上通过图文并茂的方式给大家分享了一个实时获取股票数据的android app应用程序源码,希望大家喜欢。