澳门金莎娱乐手机版 操作系统 最近正好朋友也在做这个东西,点击添加好友后toast提示已经添加

最近正好朋友也在做这个东西,点击添加好友后toast提示已经添加



澳门金莎娱乐手机版 1

    本地化之章!

—苏醒内容开头—

[cp]从数据库user表中寻找,呈现到listview中,点击列表项能够有列表框弹出来,有多个按键,分别是足够,查看他的音信和查阅本人的密友,点击增加老铁后toast提醒已经增添,查看本身的知音能够将数据库myfriend(小编的知心人卡塔尔表的开始和结果体现到listview中,须要是如此的,用sqlite,然后应该是,八个表五个类吗,还会有叁个主类,正是一齐是5个类吗?若是能够的话,能给自家看看实今世码吗?即使有大约源码的就更加好啊

 往期传送门:

结果截图如下:

  1.

澳门金莎娱乐手机版 2澳门金莎娱乐手机版 3

  2.

首先张图是程序主分界面,主假如突显记事列表的黄金时代对个事件。旁边的侧拉框是团结登入用的。能够安装密码。能够查看反馈与有关等音讯。

  3.

点击第一张图片下方的Logo,展会示分歧的剧情,分别如下:

  4.

澳门金莎娱乐手机版 4澳门金莎娱乐手机版 5澳门金莎娱乐手机版 6澳门金莎娱乐手机版 7

  5.

那四张图分别是增多心思,计算心境记录,设置闹铃,开启音乐。分别对应  增加心绪模块、总括心情记录模块、铃声提示模块、音乐播放器模块

  6.

     
按作者的主张,此款app首要用来记录心理,何况可以边播放音乐边写日记。而且,还是可以透过闹铃提示大家写日记。何况,还足以总括大家前段时间的心气状态,为当下调动职业景况提供参谋的借助。

    真没想到那东西依旧还可能会写到第七篇,非常多亲们的叙述和鼓舞给了本身非常大的引力啊,近年来恰亲密的朋友也在做这么些事物,然则大家用同后生可畏的库和后端做的东西依然不黄金时代致(他用这么些做了联网弹幕!澳门金莎娱乐手机版 8),不超过实际在发掘了某些主题材料举个例子asmack的库内容犬牙交错,非常多提供格局都不均等,看来使用者们都或多或少的对源码举行了部分校正,都变得乱糟糟的啊!

     
当然,此款app还会有个别其余部分小成效,比方日志的删除,编辑,等等。不再说了。

    这里就提供一下本人本身用的asmack库吧,省的门阀用的不平等:http://files.cnblogs.com/files/lfkdsk/asmack.zip

     上边我说说短处:

    本次的博文先从不负职务的功用最初吧,这一个并不是最后稿,因为固然成功了广大的功用啊,不过还也可以有部分难题,譬喻接受数据没用广播啊,监听的ChatListener没放在server里啊,基友系统并不完善啊,相当多的东西还并未有到位,届时候还要依据这么些事物进行部分改进,然则以往须要的功力已经足足了,接着的那些东西也只是是要运用asmack库里的东西而已了,好了先上效果图:

透过测量检验自个儿意识:

    

1、在第八个功效模块中,也正是音乐播放器上,暂停按键用持续,逻辑上倒霉达成,因为尾部是用service做的,所以,不太好完毕。

澳门金莎娱乐手机版 9

2、音乐播放器模块中,现在还只是简短的加载手提式有线电话机当中的音乐,未有落到实处在线音乐播放。

(1.率首先登场陆分界面扩充了Ip的选项,更享有Spark的android版的以为到,通用性强了,然而本人后来若是想上线让我们用或许会删掉)

3、在侧拉分界面,由于岁月难题,未有把分享亲密的朋友这么些作用集成上去,按本人的思绪,能够借用友盟的社会化组件集成一下,可是这一个必要到不一致的阳台申请appkey,认为很劳碌,就不曾做了,假若前期一时光以来,这一个有供给开支一下。

   

4、对于第几个作用模块—-铃声提示模块,未有做铃声选取功能,按理说,响铃是足以客商设置的,认为此款app的重要功用不在于此,所以就没做了。

澳门金莎娱乐手机版 10

5、对于第1个效用模块—-计算心思记录模块,大家能够查阅激情轨迹,但没有增多相应的建议,譬如当你一个月当中bad的大队人马,未有加一些振奋人心的用语。

(2.现行反革命不展开具体的闲聊窗口,程序也不会蹦了,因为原来是平昔向listview里面加多数据,但是listview还未开端化所以会崩)

6、对于第贰个作用模块—-增添心境模块,此模块可能能够增添的笑貌等图标太少,未有付诸超多。中期大概会增多一些任何好笑点的Logo进去。

澳门金莎娱乐手机版 11

 

(3.开辟具体的useractivity就能抽取原本的数码然后还应该有新打字与印刷的出来的)

症结说完了,作者未来扯一下,可以兑现的成效:

澳门金莎娱乐手机版 12

一言九鼎来讲,此款app由5个分界面组成:主分界面+4个功能分界面组成。

(4.消息由于是走数据库了,所以分发也不会想原本相像出错了)              
                                                                       
                            

主分界面:首要用以呈现心境记录的风度翩翩对个新闻,左边侧拉框能够设置密码,退出等一些小的效劳。

                                                      澳门金莎娱乐手机版 13 
  

拉长心态模块:重要用于记录当日的心怀状态,上边包车型客车笑貌能够增减,当然也得以增多表情。

(5.本人不想用守旧的文告栏,那几个客商能禁止使用,哈哈哈哈哈哈哈,作者用了定制的Toast,在桌面包车型地铁时候接到音信就能弹出二个Toast提醒!)

总括激情记录模块:主要用于总计心绪轨迹,三个是直方图展示,三个是折线图显示。

好了那正是大家这一次要完毕的意义,让我们三个三个来!

铃声提示模块:重要用于提示客户何时记录心思,当然,也得以当机械钟使用。

        1.率先从主分界面包车型客车输入IP初始:

 1  <TableRow>
 2             <TextView
 3                 android:textColor="#ffc2c6c6"
 4                 android:layout_height="wrap_content"
 5                 android:text="Ip"/>
 6             <EditText
 7                 android:id="@+id/login_ip"
 8                 android:hint="Input your Ip"
 9                 android:maxLines="1"
10                 android:layout_height="wrap_content"
11                 />
12         </TableRow>

        先在TableLayout里添加。

        静态数据类里增加:

1     //ip名称
2     public static String My_Ip = "";

 

        主活动的拉长:

ip = (EditText) findViewById(R.id.login_ip);

 

        check_init(卡塔尔(英语:State of Qatar)函数里拉长:

 1  private void checkbox_init() {//checkbox判断函数
 2         //判断记住密码多选框的状态
 3         if(sp.getBoolean("ISCHECK", false))
 4         {
 5             //设置默认是记录密码状态
 6             check_save.setChecked(true);
 7             ip.setText(sp.getString("USER_IP", ""));
 8             name.setText(sp.getString("USER_NAME",""));
 9             password.setText(sp.getString("PASSWORD",""));
10             //判断自动登陆多选框状态
11             if(sp.getBoolean("AUTO_ISCHECK", false))
12             {
13                 //设置默认是自动登录状态
14                 check_auto.setChecked(true);
15                 //跳转界面
16                 //account=sp.getString("USER_NAME","");
17                 //pwd=sp.getString("PASSWORD","");
18                 Log.i("======================"+account,pwd+"===================================");
19                 accountLogin();
20             }
21         }
22     }
23     private void setCheck_save(){
24         if(check_save.isChecked())
25         {
26             //记住用户名、密码、
27             editor = sp.edit();
28             editor.putString("USER_IP", user.My_Ip);
29             editor.putString("USER_NAME", account);
30             editor.putString("PASSWORD",pwd);
31             editor.apply();
32         }
33     }

 

        那些是把Ip加多进记录。

        修正登入的不二等秘书诀:

 1    private void accountLogin() {
 2         new Thread() {
 3             public void run() {
 4                 user.My_Ip = ((EditText)findViewById(R.id.login_ip))
 5                         .getText().toString();
 6                 account = ((EditText) findViewById(R.id.login_name))
 7                         .getText().toString();
 8                 pwd = ((EditText) findViewById(R.id.login_password)).getText()
 9                         .toString();
10                 boolean is = ConnecMethod.login(account, pwd);
11                 if (is) {
12                     insHandler.sendEmptyMessage(1);
13                     // 将用户名保存
14                     user.UserName = account+"@lfkdsk/Spark 2.6.3";
15                     user.UserName_= account;
16                     setCheck_save();
17                 } else {
18                     insHandler.sendEmptyMessage(0);
19                 }
20             }
21         }.start();
22     }

 

     可是若是逐层的为函数增多参数,然后Infiniti的传参也是意气风发种不太现实的点子,所以大家在XMpp连接的地点平素调用静态存款和储蓄的IP:

 1     public static boolean openConnection() {
 2         try {
 3             connConfig = new ConnectionConfiguration(user.My_Ip, 5222);
 4             // 设置登录状态为离线
 5             connConfig.setSendPresence(false);
 6             // 断网重连
 7             connConfig.setReconnectionAllowed(true);
 8             con = new XMPPConnection(connConfig);
 9             con.connect();
10             return true;
11         } catch (Exception e) {
12 
13         }
14         return false;
15     }

 

     那样大家登入的时候就会手动钦命ip恐怕是域名了,巩固了通用性。

音乐播放器:首要用于边写日记,边听音乐。音乐皆现在台播放。

   2.本地化数据的具体操作:

 

  1.新建三个类作为本地数据库的沙盘模拟经营:

 1 package com.lfk.webim.appli;
 2 
 3 import android.util.Log;
 4 
 5 /**
 6  * Created by Administrator on 2015/5/26.
 7  */
 8 public class TalkLogs {
 9     private String ID = "_id";              //数据库主键,自增
10     private String With_Id ="with_id";      //和谁聊天
11     private String Logs = "talklogs";       //聊天记录
12     private String If_read = "_ifread";     //是否已读
13     private String dbname;                  //数据表名---为用户名,即user.UserName_
14     private String CREAT_DB = "";           //数据库新建的语句
15 
16     public TalkLogs(String dbname){
17         this.dbname = dbname;
18         giveanameto(dbname);
19         Log.e("dbname=====", this.dbname);
20         Log.e("dbname参数=====",dbname);
21     }
22     private void giveanameto(String dbname){
23         CREAT_DB = "CREATE TABLE if not exists "+dbname+"("
24                 +this.ID +" integer primary key autoincrement,"
25                 +this.With_Id+","
26                 +this.If_read+" integer,"
27                 + this.Logs+")";
28     }
29     public String returnAString(){
30         Log.e("CREAT_DB===========",CREAT_DB);
31         return CREAT_DB;
32     }
33 }

 

 1 package com.lfk.webim.appli;
 2 
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 import android.widget.Toast;
 7 
 8 /**
 9  * Created by Administrator on 2015/5/25.
10  */
11 public class SQLiteHelper extends SQLiteOpenHelper {
12     private Context mcontext;
13     public SQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
14         super(context, name, factory, version);
15         mcontext = context;
16     }
17     @Override
18     public void onCreate(SQLiteDatabase db) {
19         //db.execSQL(CREAT_DB);
20         Toast.makeText(mcontext, "succeed collect!", Toast.LENGTH_SHORT).show();
21     }
22 
23     @Override
24     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
25     }
26 }

  写多个空的SQLiteHelper,把表放在后面。

  代码里做了详尽的注释,类里面传来客户名,重回新建表的String语句。

1     public void CreateNewTable(){
2         sqLiteHelper = new SQLiteHelper(this,"user_logs.db",null,1);    //新建.db文件
3         sqLiteDatabase = sqLiteHelper.getWritableDatabase();            
4         TalkLogs talklog = new TalkLogs(user.UserName_);                //获取新建表的语句
5         sqLiteDatabase.execSQL(talklog.returnAString());                //新建表
6         Toast.makeText(friend.this, user.UserName_+" Create success",Toast.LENGTH_SHORT).show();
7         Log.e(user.UserName_, "success!!!");
8         //sqLiteDatabase.close();
9         }

  在friend的activity里面,新建该措施,每趟步入朋友分界面,新建以顾客名字为名的表,因为用的SQL语句写了if
exist 所以已部分不会新建。

1 final ClientConServer server = new ClientConServer(this,mhandler,this.sqLiteDatabase);

  对工具类实行实例化,能够解决静态方法不能够用在非静态上下文的难点,这里传出context,handler,和数据库,数据库是为着制止打开重复,传入handler是为了桌面Toast

分界面设计:

  2.改变后的friend活动:

澳门金莎娱乐手机版 14澳门金莎娱乐手机版 15

  1 package com.lfk.webim;
  2 
  3 import android.content.Intent;
  4 import android.database.sqlite.SQLiteDatabase;
  5 import android.os.Bundle;
  6 import android.os.Handler;
  7 import android.support.v4.widget.SwipeRefreshLayout;
  8 import android.util.Log;
  9 import android.view.Gravity;
 10 import android.view.KeyEvent;
 11 import android.view.LayoutInflater;
 12 import android.view.View;
 13 import android.view.ViewGroup;
 14 import android.widget.AdapterView;
 15 import android.widget.ArrayAdapter;
 16 import android.widget.ImageView;
 17 import android.widget.ListView;
 18 import android.widget.TextView;
 19 import android.widget.Toast;
 20 
 21 import com.lfk.webim.appli.BaseActivity;
 22 import com.lfk.webim.appli.SQLiteHelper;
 23 import com.lfk.webim.appli.TalkLogs;
 24 import com.lfk.webim.appli.user;
 25 import com.lfk.webim.server.Myserver;
 26 import com.lfk.webim.server.connect;
 27 
 28 
 29 public class friend extends BaseActivity {
 30     public static ArrayAdapter<String> mArrayAdapter;
 31     public SwipeRefreshLayout swipeLayout;
 32     private SQLiteDatabase sqLiteDatabase;
 33     private SQLiteHelper sqLiteHelper;
 34     @Override
 35     protected void onCreate(Bundle savedInstanceState) {
 36         super.onCreate(savedInstanceState);
 37         setContentView(R.layout.activity_friend);
 38 
 39         CreateNewTable();
 40         final ClientConServer server = new ClientConServer(this,mhandler,this.sqLiteDatabase);
 41 
 42         swipeLayout = (SwipeRefreshLayout)findViewById(R.id.swipe_refresh);
 43         TextView textView=(TextView)findViewById(R.id.name);
 44         textView.setText(user.UserName_ + "的朋友");
 45 
 46         Intent intentServer= new Intent(this, Myserver.class);
 47         startService(intentServer);
 48 
 49         final ListView listView=(ListView)findViewById(R.id.friend_list);
 50         mArrayAdapter= new ArrayAdapter<String>(this, R.layout.list_item);
 51         listView.setAdapter(mArrayAdapter);
 52 
 53         //server.getFriends();
 54         //server.getChat();
 55 
 56         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 57             @Override
 58             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
 59                                     long arg3) {
 60                 String temp = (String) ((TextView) arg1).getText();
 61                 Intent intent = new Intent();
 62                 String temper = temp + "@lfkdsk/Smack";
 63                 Log.e(temp + "================", temper);
 64                 user.FromName = temper;
 65                 user.FromName_ = temp;
 66                 intent.putExtra("FromName", temper);
 67                 intent.setClass(friend.this, useractivity.class);
 68                 startActivity(intent);
 69                 Toast.makeText(getApplicationContext(),
 70                         "Chat with " + temp,
 71                         Toast.LENGTH_SHORT).show();
 72                 mArrayAdapter.notifyDataSetChanged();
 73             }
 74         });
 75 
 76         swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
 77             @Override
 78             public void onRefresh() {
 79                 new Handler().postDelayed(new Runnable() {//延迟跳转=-=
 80                     public void run() {
 81                         swipeLayout.setRefreshing(true);
 82                         mArrayAdapter.clear();
 83                         server.getFriends();
 84                         swipeLayout.setRefreshing(false);
 85                     }
 86                 }, 500);
 87             }
 88         });
 89     }
 90 
 91     public void CreateNewTable(){
 92         sqLiteHelper = new SQLiteHelper(this,"user_logs.db",null,1);    //新建.db文件
 93         sqLiteDatabase = sqLiteHelper.getWritableDatabase();
 94         TalkLogs talklog = new TalkLogs(user.UserName_);                //获取新建表的语句
 95         sqLiteDatabase.execSQL(talklog.returnAString());                //新建表
 96         Toast.makeText(friend.this, user.UserName_+" Create success",Toast.LENGTH_SHORT).show();
 97         Log.e(user.UserName_, "success!!!");
 98         //sqLiteDatabase.close();
 99         }
100     public  Handler mhandler = new Handler()
101     {
102         public void handleMessage(android.os.Message message)
103         {
104             switch (message.what) {
105                 case 0:
106                     Bundle bundle = (Bundle)message.obj;            //桌面Toast的解决方法
107                     String s1 = bundle.getString("name");
108                     String s2 = bundle.getString("text");
109                     showCustomToast(s1,s2);
110                     break;
111                 case 1: {
112                     String temp = (String) message.obj;
113                     friend.mArrayAdapter.add(temp);
114                     break;
115                 }
116             }
117         }
118     };
119     protected void onDestroy()
120     {
121         super.onDestroy();
122         connect.closeConnection();
123         Intent stopintent=new Intent(this, Myserver.class);
124         stopService(stopintent);
125     }
126     private long exitTime = 0;
127     @Override
128     public boolean onKeyDown(int keyCode, KeyEvent event) {
129         if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
130             Intent home = new Intent(Intent.ACTION_MAIN);
131             home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
132             home.addCategory(Intent.CATEGORY_HOME);
133             startActivity(home);
134             return true;
135         }
136         return super.onKeyDown(keyCode, event);
137     }
138     public void showCustomToast(String s1, String s2) {//新建显示TOAST
139         // 通用的布局加载器
140         LayoutInflater inflater = getLayoutInflater();
141         // 加载根容器,方便用于后面的view的定位
142         View layout = inflater.inflate(R.layout.toast_view, (ViewGroup)findViewById(R.id.llToast));
143         // 设置图片的源文件
144         ImageView image = (ImageView) layout.findViewById(R.id.tvImageToast);
145         image.setImageResource(R.drawable.toast_image);
146         // 设置title及内容
147         TextView title = (TextView) layout.findViewById(R.id.tvTitleToast);
148         title.setText(s1);
149         TextView text = (TextView) layout.findViewById(R.id.tvTextToast);
150         text.setText(s2);
151         Toast tempToast = new Toast(getApplicationContext());
152         // 设置位置
153         tempToast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER, 0, 0);
154         // 设置显示时间
155         tempToast.setDuration(Toast.LENGTH_SHORT);
156         tempToast.setView(layout);
157         tempToast.show();
158     }
159 }

friend活动

只举二个例证来做牵线:

    3.工具类进行了非常大的改变,详细解说:

澳门金莎娱乐手机版 16澳门金莎娱乐手机版 17

  1 package com.lfk.webim;
  2 
  3 import android.app.ActivityManager;
  4 import android.content.ComponentName;
  5 import android.content.ContentValues;
  6 import android.content.Context;
  7 import android.content.Intent;
  8 import android.content.pm.PackageManager;
  9 import android.content.pm.ResolveInfo;
 10 import android.database.Cursor;
 11 import android.database.sqlite.SQLiteDatabase;
 12 import android.os.Bundle;
 13 import android.os.Handler;
 14 import android.util.Log;
 15 
 16 import com.lfk.webim.appli.user;
 17 import com.lfk.webim.server.connect;
 18 
 19 import org.jivesoftware.smack.Chat;
 20 import org.jivesoftware.smack.ChatManager;
 21 import org.jivesoftware.smack.ChatManagerListener;
 22 import org.jivesoftware.smack.MessageListener;
 23 import org.jivesoftware.smack.Roster;
 24 import org.jivesoftware.smack.RosterEntry;
 25 import org.jivesoftware.smack.RosterGroup;
 26 import org.jivesoftware.smack.packet.Message;
 27 
 28 import java.util.ArrayList;
 29 import java.util.Collection;
 30 import java.util.List;
 31 
 32 
 33 public class ClientConServer {
 34     private Context context;
 35     private Handler handlers;
 36     private SQLiteDatabase sqLiteDatabase;
 37 
 38     ClientConServer(Context context,Handler handler,SQLiteDatabase sqLiteDatabase){
 39         this.context = context;
 40         this.handlers = handler;
 41         this.sqLiteDatabase = sqLiteDatabase;
 42         getFriends();
 43         getChat();
 44         System.out.print(isAppForground(context));
 45     }
 46     //这里收到消息
 47     private  Handler handler = new Handler(){
 48         public void handleMessage(android.os.Message m) {
 49             Message msg = new Message();
 50             msg = (Message) m.obj;
 51             //把从服务器获得的消息通过发送
 52             String[] message = new String[]{ msg.getFrom(), msg.getBody()};
 53             System.out.println("==========收到消息  From==========="+ message[0]);
 54             System.out.println("==========收到消息  Body===========" + message[1]);
 55             String s = msg.getFrom();
 56             String s1 = s.split("@")[0];
 57             ContentValues values = new ContentValues();
 58             if(message[1]!=null) {
 59                 if (user.UserName.equals(message[0])) {
 60                     values.put("with_id",s1);
 61                     values.put("talklogs", "ME: " + msg.getBody());
 62                     values.put("_ifread",0);
 63                     Log.e("存入:", "ME: " + msg.getBody());
 64                     sqLiteDatabase.insert(""" + user.UserName_ + """, null, values);
 65                     values.clear();
 66                 } else {
 67                     values.put("with_id", s1);
 68                     values.put("talklogs", s1 + "说:" + msg.getBody());
 69                     values.put("_ifread", 0);
 70                     Log.e("存入:", s1 + "说:" + msg.getBody());
 71                     sqLiteDatabase.insert(""" + user.UserName_ + """, null, values);
 72                     addUnread(values,s1);
 73                 }
 74                 if(isHome(context)){
 75                     sendToast(msg,s1);
 76                 }
 77             }
 78         }
 79     };
 80     public void getFriends(){
 81             //获取用户组、成员信息
 82             System.out.println("--------find start----------");
 83             Roster roster = connect.con.getRoster();
 84             Collection<RosterGroup> entriesGroup = roster.getGroups();
 85             System.out.println("team:" + entriesGroup.size());
 86             for(RosterGroup group: entriesGroup){
 87                 Collection<RosterEntry> entries = group.getEntries();
 88                 int temp=group.getEntryCount();
 89                 System.out.println("--------groupnumber--------" + "n" + temp);
 90                 System.out.println("--------groupName----------" + "n" + group.getName());
 91                 for (RosterEntry entry : entries) {
 92                     System.out.println("name:"+entry.getName());
 93                     String string2 = entry.getName();
 94                     android.os.Message message_list = new android.os.Message();
 95                     message_list.obj = string2;
 96                     message_list.what = 1;
 97                     handlers.sendMessage(message_list);
 98                 }
 99             }
100             System.out.println("--------find end--------");
101     }
102     private void addUnread(ContentValues values,String s1){
103         if (isAppForground(context)&& s1.equals(user.FromName_)) {
104             Cursor cursor = sqLiteDatabase.rawQuery("Select * From "+user.UserName_+" where with_id ="+"""+user.FromName_+"""+"And _ifread ="+0,null);
105             if(cursor.moveToFirst()) {
106                 do {
107                     String talklogs = cursor.getString(cursor.getColumnIndex("talklogs"));
108                     useractivity.mConversationArrayAdapter.add(talklogs);
109                     Log.e(talklogs, "================");
110                 }while (cursor.moveToNext());
111             }
112             if(!isAppForground(context))
113                 useractivity.mConversationArrayAdapter.notifyDataSetChanged();
114             cursor.close();
115         }
116         values.clear();
117     }
118     private void sendToast(Message msg,String s1){
119         android.os.Message message_send = new android.os.Message();
120         Bundle bundle = new Bundle();
121         bundle.putString("name",s1);
122         bundle.putString("text",msg.getBody());
123         message_send.obj = bundle;
124         message_send.what = 0;
125         handlers.sendMessage(message_send);
126     }
127     private void getChat(){
128         //在登陆以后应该建立一个监听消息的监听器,用来监听收到的消息:
129         ChatManager chatManager = connect.con.getChatManager();
130         chatManager.addChatListener(new MyChatManagerListener());
131     }
132     /** message listener*/
133      class MyChatManagerListener implements ChatManagerListener {
134         public void chatCreated(Chat chat, boolean arg1) {
135             chat.addMessageListener(new MessageListener(){
136                 @Override
137                 public void processMessage(Chat chat, Message msg) {
138                     android.os.Message m = handler.obtainMessage();
139                     m.obj = msg;
140                     m.sendToTarget();
141                 }
142             });
143         }
144     }
145     public boolean isAppForground(Context mContext) {
146         ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
147         List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
148         if (!tasks.isEmpty()) {
149             ComponentName topActivity = tasks.get(0).topActivity;
150             if (!topActivity.getPackageName().equals(mContext.getPackageName())) {
151                 return false;
152             }
153         }
154         return true;
155     }
156     public boolean isHome(Context mContext){
157         ActivityManager mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
158         List<ActivityManager.RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
159         return getHomes(mContext).contains(rti.get(0).topActivity.getPackageName());
160         }
161     /**
162      * 获得属于桌面的应用的应用包名称
163      * @return 返回包含所有包名的字符串列表
164      */
165     private List<String> getHomes(Context mContext) {
166         List<String> names = new ArrayList<String>();
167         PackageManager packageManager = mContext.getPackageManager();
168         //属性
169         Intent intent = new Intent(Intent.ACTION_MAIN);
170         intent.addCategory(Intent.CATEGORY_HOME);
171         List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,
172                 PackageManager.MATCH_DEFAULT_ONLY);
173         for(ResolveInfo ri : resolveInfo){
174             names.add(ri.activityInfo.packageName);
175             System.out.println(ri.activityInfo.packageName);
176         }
177         return names;
178     }
179 }

工具类

1 ClientConServer(Context context,Handler handler,SQLiteDatabase sqLiteDatabase){
2         this.context = context;
3         this.handlers = handler;
4         this.sqLiteDatabase = sqLiteDatabase;
5         getFriends();
6         getChat();
7         System.out.print(isAppForground(context));
8     }

澳门金莎娱乐手机版 18

  3.1布局函数,用于实例化。

 1  private void addUnread(ContentValues values,String s1){
 2         if (isAppForground(context)&& s1.equals(user.FromName_)) {
 3             Cursor cursor = sqLiteDatabase.rawQuery("Select * From "+user.UserName_+" where with_id ="+"""+user.FromName_+"""+"And _ifread ="+0,null);
 4             if(cursor.moveToFirst()) {
 5                 do {
 6                     String talklogs = cursor.getString(cursor.getColumnIndex("talklogs"));
 7                     useractivity.mConversationArrayAdapter.add(talklogs);
 8                     Log.e(talklogs, "================");
 9                 }while (cursor.moveToNext());
10             }
11             if(!isAppForground(context))
12                 useractivity.mConversationArrayAdapter.notifyDataSetChanged();
13             cursor.close();
14         }
15         values.clear();
16     }

拿主分界面来做牵线:

  3.2探索全体与自家闲聊的人的记录,并且为未读。

public boolean isAppForground(Context mContext) {
        ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(mContext.getPackageName())) {
                return false;
            }
        }
        return true;
    }
    public boolean isHome(Context mContext){
        ActivityManager mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
        return getHomes(mContext).contains(rti.get(0).topActivity.getPackageName());
        }
    /**
     * 获得属于桌面的应用的应用包名称
     * @return 返回包含所有包名的字符串列表
     */
    private List<String> getHomes(Context mContext) {
        List<String> names = new ArrayList<String>();
        PackageManager packageManager = mContext.getPackageManager();
        //属性
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,
                PackageManager.MATCH_DEFAULT_ONLY);
        for(ResolveInfo ri : resolveInfo){
            names.add(ri.activityInfo.packageName);
            System.out.println(ri.activityInfo.packageName);
        }
        return names;
    }
}

全套分界面有三个大的LinearLayout线性布局+多少个include(其实这几个是两个嵌套的构造,就是达成地点的标题效果)+三个listview+嵌套二个LinearLayout(用此线性布局的缘故是因为用它能够来贯彻下边那八个小Logo的对齐卡塔尔(قطر‎+五个ImageButton.

  3.3论断以往栈顶的位移是怎么?还也许有是不是在桌面。

现实就这么多。代码如下:(折叠开关能够展开)

  3.4音讯的散发机制

  这里供给疏解一下作者的闲谈机制,ChatListener选拔数据,然后存入数据库,假设以往的栈顶活动为对象分界面(有一个料定),就默默的存进去,假诺是闲谈分界面就把具备数据Curry的抽出来,把富有的信息都设为已读(_ifread=1),放在listview里,

然后风流浪漫旦有新消息的话,就用3.1的诀窍把全体的_ifread的音讯抽出来,即时的显示在listview里面,假使今日为桌面,就把东西存入然后再Toast出来。

澳门金莎娱乐手机版,  所以handler就是主要的音讯分发机制:

 1  private  Handler handler = new Handler(){
 2         public void handleMessage(android.os.Message m) {
 3             Message msg = new Message();
 4             msg = (Message) m.obj;
 5             //把从服务器获得的消息通过发送
 6             String[] message = new String[]{ msg.getFrom(), msg.getBody()};
 7             System.out.println("==========收到消息  From==========="+ message[0]);
 8             System.out.println("==========收到消息  Body===========" + message[1]);
 9             String s = msg.getFrom();
10             String s1 = s.split("@")[0];
11             ContentValues values = new ContentValues();
12             if(message[1]!=null) {
13                 if (user.UserName.equals(message[0])) {
14                     values.put("with_id",s1);
15                     values.put("talklogs", "ME: " + msg.getBody());
16                     values.put("_ifread",0);
17                     Log.e("存入:", "ME: " + msg.getBody());
18                     sqLiteDatabase.insert(""" + user.UserName_ + """, null, values);
19                     values.clear();
20                 } else {
21                     values.put("with_id", s1);
22                     values.put("talklogs", s1 + "说:" + msg.getBody());
23                     values.put("_ifread", 0);
24                     Log.e("存入:", s1 + "说:" + msg.getBody());
25                     sqLiteDatabase.insert(""" + user.UserName_ + """, null, values);
26                     addUnread(values,s1);
27                 }
28                 if(isHome(context)){
29                     sendToast(msg,s1);
30                 }
31             }
32         }
33     };

 

澳门金莎娱乐手机版 19澳门金莎娱乐手机版 20

  4.更上意气风发层楼后的聊天分界面:

澳门金莎娱乐手机版 21澳门金莎娱乐手机版 22

  1 package com.lfk.webim;
  2 
  3 import android.content.ContentValues;
  4 import android.database.Cursor;
  5 import android.database.sqlite.SQLiteDatabase;
  6 import android.os.Bundle;
  7 import android.os.Environment;
  8 import android.os.Handler;
  9 import android.util.Log;
 10 import android.view.View;
 11 import android.widget.ArrayAdapter;
 12 import android.widget.Button;
 13 import android.widget.EditText;
 14 import android.widget.ListView;
 15 import android.widget.TextView;
 16 import android.widget.Toast;
 17 
 18 import com.lfk.webim.appli.BaseActivity;
 19 import com.lfk.webim.appli.user;
 20 import com.lfk.webim.server.connect;
 21 
 22 import org.jivesoftware.smack.Chat;
 23 import org.jivesoftware.smack.ChatManager;
 24 import org.jivesoftware.smack.MessageListener;
 25 import org.jivesoftware.smack.XMPPConnection;
 26 import org.jivesoftware.smack.XMPPException;
 27 import org.jivesoftware.smack.packet.Message;
 28 
 29 import java.io.File;
 30 
 31 public class useractivity extends BaseActivity {
 32     private ListView listView;
 33     public static ArrayAdapter<String> mConversationArrayAdapter;
 34     private ClientConServer server;
 35     private SQLiteDatabase database;
 36     @Override
 37     protected void onCreate(Bundle savedInstanceState) {
 38         super.onCreate(savedInstanceState);
 39         setContentView(R.layout.useractivity);
 40 
 41         getActionBar().setDisplayHomeAsUpEnabled(true);
 42 
 43         //server = (ClientConServer)getIntent().getSerializableExtra("ClientConServer");
 44 
 45         listView = (ListView) findViewById(R.id.in);
 46         TextView textView = (TextView) findViewById(R.id.username);
 47         textView.setText("Talk with "+user.FromName_);
 48 
 49         mConversationArrayAdapter = new ArrayAdapter<String>(this, R.layout.message);
 50         listView.setAdapter(mConversationArrayAdapter);
 51 
 52         OpenDatabase();
 53 
 54         //server = new ClientConServer(mhandle);
 55 
 56         Button button = (Button)findViewById(R.id.button_send);
 57 
 58         button.setOnClickListener(new View.OnClickListener() {
 59             @Override
 60             public void onClick(View v) {
 61                 EditText input = (EditText) findViewById(R.id.edit_text_out);
 62                 final String content = input.getText().toString();
 63                 String string = "ME" + ":" + content;
 64                 android.os.Message mm = new android.os.Message();
 65                 mm.what = 0;
 66                 mm.obj = content;
 67                 try {
 68                     XMPPConnection connection = connect.getConnection();
 69                     ChatManager cm = connection.getChatManager();
 70                     Chat chat = cm.createChat(user.FromName, new MessageListener() {
 71                         @Override
 72                         public void processMessage(Chat chat, Message msg) {
 73                             msg.setBody(content);
 74                             Log.i("---", msg.getFrom() + "说:" + msg.getBody());
 75                             //添加消息到聊天窗口
 76                         }
 77                     });
 78                     if (content.equals("")) {
 79                         mm.what = 1;
 80                         mhandle.handleMessage(mm);
 81                     } else {
 82                         mhandle.handleMessage(mm);
 83                         chat.sendMessage(content);
 84                     }
 85                     input.setText("");
 86                 } catch (XMPPException e) {
 87                     e.printStackTrace();
 88                 }
 89             }
 90 
 91         });
 92     }
 93     public Handler mhandle = new Handler() {
 94         public void handleMessage(android.os.Message m) {
 95             switch (m.what) {
 96                 case 1:
 97                     Toast.makeText(useractivity.this, "不能发送空消息", Toast.LENGTH_SHORT).show();
 98                     break;
 99                 case 0:
100                     String respond = (String) m.obj;
101                     Log.i("---", respond);
102                     ContentValues values = new ContentValues();
103                     values.put("with_id",user.FromName_);
104                     values.put("talklogs","ME: "+respond);
105                     values.put("_ifread",0);
106                     Log.e("存入:", "ME: " + respond);
107                     database.insert(""" + user.UserName_ + """, null, values);
108                     values.clear();
109                     mConversationArrayAdapter.add("ME: "+respond);
110                     mConversationArrayAdapter.notifyDataSetChanged();
111                     break;
112                 case 2:
113                     //addTheListview();
114                     break;
115             }
116         }
117     };
118     private void OpenDatabase(){
119         String DB_NAME = "user_logs.db"; //保存的数据库文件名
120         String PACKAGE_NAME = "com.lfk.webim";// 应用的包名
121         String DB_PATH = "/data"
122                 + Environment.getDataDirectory().getAbsolutePath() +"/"
123                 + PACKAGE_NAME+ "/databases"; // 在手机里存放数据库的位置
124         File myDataPath = new File(DB_PATH);
125         String dbfile = myDataPath+"/"+DB_NAME;
126         database = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
127         if(!checkColumnExist1(database,user.UserName_,user.FromName_)){
128             Cursor cursor = database.rawQuery("Select * From "+user.UserName_+" where with_id ="+"""+user.FromName_+""",null);
129             if(cursor.moveToFirst()) {
130                 do {
131                     String talklogs = cursor.getString(cursor.getColumnIndex("talklogs"));
132                     mConversationArrayAdapter.add(talklogs);
133                     Log.e(talklogs, "================");
134                 }while (cursor.moveToNext());
135             }
136             database.execSQL("UPDATE "+user.UserName_+" SET _ifread = 1 "+"Where with_id ="+"""+user.FromName_+""");
137             cursor.close();
138             //database.close();
139         }
140     }
141     public static boolean checkColumnExist1(SQLiteDatabase db, String tableName, String columnName) {
142         boolean result = false ;
143         Cursor cursor = null ;
144         try{
145             //查询一行
146             cursor = db.rawQuery( "SELECT * FROM " + tableName + " LIMIT 0", null );
147             result = cursor != null && cursor.getColumnIndex(columnName) != -1 ;
148         }catch (Exception e){
149             Log.e("","checkColumnExists1..." + e.getMessage()) ;
150         }finally{
151             if(null != cursor && !cursor.isClosed()){
152                 cursor.close() ;
153             }
154         }
155         return result ;
156     }
157 }

闲谈活动

 

 1     private void OpenDatabase(){
 2         String DB_NAME = "user_logs.db"; //保存的数据库文件名
 3         String PACKAGE_NAME = "com.lfk.webim";// 应用的包名
 4         String DB_PATH = "/data"
 5                 + Environment.getDataDirectory().getAbsolutePath() +"/"
 6                 + PACKAGE_NAME+ "/databases"; // 在手机里存放数据库的位置
 7         File myDataPath = new File(DB_PATH);
 8         String dbfile = myDataPath+"/"+DB_NAME;
 9         database = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
10         if(!checkColumnExist1(database,user.UserName_,user.FromName_)){
11             Cursor cursor = database.rawQuery("Select * From "+user.UserName_+" where with_id ="+"""+user.FromName_+""",null);
12             if(cursor.moveToFirst()) {
13                 do {
14                     String talklogs = cursor.getString(cursor.getColumnIndex("talklogs"));
15                     mConversationArrayAdapter.add(talklogs);
16                     Log.e(talklogs, "================");
17                 }while (cursor.moveToNext());
18             }
19             database.execSQL("UPDATE "+user.UserName_+" SET _ifread = 1 "+"Where with_id ="+"""+user.FromName_+""");
20             cursor.close();
21             //database.close();
22         }
23     }

 

  每便走入都先开垦数据库,而且把具备的闲聊对应的人的数据库音信抽取来,然后把持有的已读标记设为1;

  

 1     public static boolean checkColumnExist1(SQLiteDatabase db, String tableName, String columnName) {
 2         boolean result = false ;
 3         Cursor cursor = null ;
 4         try{
 5             //查询一行
 6             cursor = db.rawQuery( "SELECT * FROM " + tableName + " LIMIT 0", null );
 7             result = cursor != null && cursor.getColumnIndex(columnName) != -1 ;
 8         }catch (Exception e){
 9             Log.e("","checkColumnExists1..." + e.getMessage()) ;
10         }finally{
11             if(null != cursor && !cursor.isClosed()){
12                 cursor.close() ;
13             }
14         }
15         return result ;
16     }

 

  这里运用了叁个艺术,用来决断表里有未有您的那一个字段,若无就毫无增添到listview里,不然你没和他聊过会崩!!

 1     public Handler mhandle = new Handler() {
 2         public void handleMessage(android.os.Message m) {
 3             switch (m.what) {
 4                 case 1:
 5                     Toast.makeText(useractivity.this, "不能发送空消息", Toast.LENGTH_SHORT).show();
 6                     break;
 7                 case 0:
 8                     String respond = (String) m.obj;
 9                     Log.i("---", respond);
10                     ContentValues values = new ContentValues();
11                     values.put("with_id",user.FromName_);
12                     values.put("talklogs","ME: "+respond);
13                     values.put("_ifread",0);
14                     Log.e("存入:", "ME: " + respond);
15                     database.insert(""" + user.UserName_ + """, null, values);
16                     values.clear();
17                     mConversationArrayAdapter.add("ME: "+respond);
18                     mConversationArrayAdapter.notifyDataSetChanged();
19                     break;
20                 case 2:
21                     //addTheListview();
22                     break;
23             }
24         }
25     };

 

  在本身发送消息的时候,存入数据库,然后增添到listview里面。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background"
    android:orientation="vertical" >

    <include layout="@layout/common_title_bg" />

   <ListView
        android:id="@+id/mood_note_list"
        android:layout_width="fill_parent"
        android:layout_height="400dp"
        android:cacheColorHint="#00000000"
        android:divider="@drawable/line"
        android:dividerHeight="1dp"
        android:drawSelectorOnTop="false"
        android:fadingEdge="none"
        android:fastScrollEnabled="true"
        android:scrollbars="vertical" 
        >
    </ListView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <ImageButton
            android:id="@+id/addMoodButton"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:src="@drawable/write" />

        <ImageButton
            android:id="@+id/mood_tendency"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:src="@drawable/tongji" />
        <ImageButton
            android:id="@+id/clock"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:src="@drawable/clock" />

        <ImageButton
            android:id="@+id/music"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:src="@drawable/music" />
    </LinearLayout>
</LinearLayout>

  3.桌面显示的Toast:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:id="@+id/llToast"
 4     android:layout_width="wrap_content"
 5     android:layout_height="wrap_content"
 6     android:background="#ffffffff"
 7     android:orientation="vertical" >
 8 
 9     <TextView
10         android:id="@+id/tvTitleToast"
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content"
13         android:layout_margin="1dip"
14         android:background="#bb000000"
15         android:gravity="center"
16         android:text="Title"
17         android:textColor="#ffffffff" />
18 
19     <LinearLayout
20         android:id="@+id/llToastContent"
21         android:layout_width="wrap_content"
22         android:layout_height="wrap_content"
23         android:layout_marginBottom="1dip"
24         android:layout_marginLeft="1dip"
25         android:layout_marginRight="1dip"
26         android:background="#44000000"
27         android:orientation="vertical"
28         android:padding="15dip" >
29 
30         <ImageView
31             android:id="@+id/tvImageToast"
32             android:layout_width="wrap_content"
33             android:layout_height="wrap_content"
34             android:layout_gravity="center"
35             android:contentDescription="@string/hello_world"
36             android:src="@drawable/toast_image" />
37 
38         <TextView
39             android:id="@+id/tvTextToast"
40             android:layout_width="128dp"
41             android:layout_height="wrap_content"
42             android:gravity="center"
43             android:paddingLeft="10dip"
44             android:paddingRight="10dip"
45             android:singleLine="false"
46             android:text="自定义显示语句"
47             android:textColor="#ff000000" />
48     </LinearLayout>
49 
50 </LinearLayout>

 

View Code

  1.增加三个toast的构造文件,写出来的旗帜是那般的:  

    澳门金莎娱乐手机版 23

分界面十分少讲,本身审美本领轻便,无法。

  2.friend内部增添多少个方法进行拍卖:

 1     public void showCustomToast(String s1, String s2) {//新建显示TOAST
 2         // 通用的布局加载器
 3         LayoutInflater inflater = getLayoutInflater();
 4         // 加载根容器,方便用于后面的view的定位
 5         View layout = inflater.inflate(R.layout.toast_view, (ViewGroup)findViewById(R.id.llToast));
 6         // 设置图片的源文件
 7         ImageView image = (ImageView) layout.findViewById(R.id.tvImageToast);
 8         image.setImageResource(R.drawable.toast_image);
 9         // 设置title及内容
10         TextView title = (TextView) layout.findViewById(R.id.tvTitleToast);
11         title.setText(s1);
12         TextView text = (TextView) layout.findViewById(R.id.tvTextToast);
13         text.setText(s2);
14         Toast tempToast = new Toast(getApplicationContext());
15         // 设置位置
16         tempToast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER, 0, 0);
17         // 设置显示时间
18         tempToast.setDuration(Toast.LENGTH_SHORT);
19         tempToast.setView(layout);
20         tempToast.show();
21     }
22 }

 

对于分界面设计那块,总结起来正是活用背景,以至各种构件之间的涉嫌,最广大嵌套,方便结构。总的原则正是,看起来直观,灵活性强。关心组间与组内的牵连就能够。

  3.显示:

   刚才在friend里面大家对工具类进行了实例化,传入了handler,正是要在工具类用handler回调,用friend的handler举办拍卖:

  

1 if(isHome(context)){
2                     sendToast(msg,s1);
3                 }

  若是在桌面:

1 private void sendToast(Message msg,String s1){
2         android.os.Message message_send = new android.os.Message();
3         Bundle bundle = new Bundle();
4         bundle.putString("name",s1);
5         bundle.putString("text",msg.getBody());
6         message_send.obj = bundle;
7         message_send.what = 0;
8         handlers.sendMessage(message_send);
9     }

  打包名字,音信发到friend的handler里去。

  

 1  public  Handler mhandler = new Handler()
 2     {
 3         public void handleMessage(android.os.Message message)
 4         {
 5             switch (message.what) {
 6                 case 0:
 7                     Bundle bundle = (Bundle)message.obj;            //桌面Toast的解决方法
 8                     String s1 = bundle.getString("name");
 9                     String s2 = bundle.getString("text");
10                     showCustomToast(s1,s2);
11                     break;
12                 case 1: {
13                     String temp = (String) message.obj;
14                     friend.mArrayAdapter.add(temp);
15                     break;
16                 }
17             }
18         }
19     };

  friend的Handler里管理一下,就能够呈现出来了。

  这一回就说那样多呢,整个德姆o已经能像正规的IM应用相像接纳了,还会有意气风发对协调的改造章程,在下生龙活虎篇的三番两次里会增添加基友啊,

加组,转入server里的一文山会海措施,敬请期望!

   中意就点赞吧!!!

  

 

 

小讲完毕、特色和问题分析:

上面笔者选取性的教学当中生机勃勃部分职能的兑现机制,篇幅有限。别的没介绍到的自个儿就点到甘休。

    
张开app,首先显示3s的推移,然后步向主分界面。主分界面是三个FragementActivity,日记展现部分,首要使用了数据库的询问操作,然后将查询到的剧情,通过适配器突显在listview中。当然,按住某生机勃勃栏不动,还恐怕会冒出删除、查看等menu选项。重要正是数据库的增加和删除改查操作。对于设置开首密码,由AlertDialog落成。若无设置密码,点击Menu中选项会运转该对话框。五次密码输入大器晚成致时,对输入字符串 经由MD5加密后存款和储蓄在SharedPreference中,密码增添成功。侧边侧拉菜单也是三个fragment,里面别的的皆以透过xml完结的,非常少讲。

   点击主分界面包车型大巴首先个imagebutton开关,此模块作用首即使加多新的心境记录。客商输入心绪内容,接受情感图片并为情感打分。通过activity达成的,当然此activity也是查看记事的activity,如若从查看记事转向恢复生机,则一贯体现相应的记叙内容。那样的话,就能够波及到数据库的有些个操作,通过游标cursor完成。

   上边讲讲数据库的安排:

此数据库的实今后com.hlb.app
包中的MoodLogProvider类中完毕。数据库的称号为MoodLogDB.db,总共就一张表:字段如下:

   _ID:表示第几条心绪记录   数据类型 int

  MOODITEM:  心绪内容             String

  TIMESTAMP:情绪记录的时刻戳   long

  ICON_ID:情感的图样列名         int

  RATING:  心绪的分数列名        float

 

  
对于第二个成效模块,主要也是叁个Activity,名叫ChartTabActivity,作用是总括解析心情的主Activity,世襲了TabActivity,并增多LineChartActivity和BarChartActivity。在这之中,LineChartActivity首要意义是将数据库中积攒的对应月份全数情愫记录得分绘成曲线图,向客户显示下个月份的激情增势。图表的绘图首要透过GraphicalView等类完成的。

 

 
对于第多个功用模块,主分界面是三个activity,机械钟的安装使用了系统自带的AlarmManager类完成的。它能够特地用来设定三个小时去做到内定的动作恐怕事件。单机“定制石英钟”开关,调用TimePickerDialog来设置时间,然后提示客商安装完结,当石英钟到安装的时辰点时,提醒客商时间到。当然,那当中用到了BroadcastReceive服务,系统是广播的发出者,此app为广播选用者,时间生机勃勃到,此app发轫响应那事件。然后成功响应的动作。那时想着,时间到了,应该用铃声来唤醒客户,所以时间朝气蓬勃到,就初始广播音乐,10s后停住。代码如下:

澳门金莎娱乐手机版 24澳门金莎娱乐手机版 25

package com.hlb.alarm;

import com.hlb.R;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.widget.Toast;
public class TimeReceive extends BroadcastReceiver {

    @Override
      public void onReceive(Context context, Intent intent)
      {
        MediaPlayer  alarmMusic  = MediaPlayer.create(context,R.raw.test);
        alarmMusic.start();
        Toast.makeText(context, "你的时间到了!!!", 10).show();
        try
        {                  
            Thread.currentThread().sleep(10000);          //延时10s
        } catch (InterruptedException e)
        {               
            e.printStackTrace();              
        }
        alarmMusic.stop();
      }
}

View Code

 

 
对于第八个功能模块,相符也是一个activity,思路正是先通过遍历客商数据库,加载音乐财富文件消息到多个list会集个中,每一种成分为叁个Mp3Info类的实例化,然后自定义MyMusicAdapter适配器,将list在这之中的数目加载到listview个中。对于listview在那之中的每三个要素,只要点击就能够播放,当然也足以由此下方的播放按键达成。点击截止按键停播。

 

对于特色:

村办认为:

1、能够完成自定义式的激情记录

2、能够绘制心绪轨迹,总括一个月或然近多少个月的心情。这会有助于大家做事于生活的内需。

3、大家得以单方面听音乐豆蔻梢头边写日记。

4、隐秘工作做得好,大家能够设置密码,幸免旁人偷看您的日志。

5、大家还是能够准时提示本人写日记,谨防本人忘记。

6、第三与第多个功效模块,能够单独采纳。不难,方便,急忙。

 

对于难题有不菲,上边仅举多少个小困难:

1、绘图。早先,这一块没怎么接触,后来,慢慢看旁人的小demo,渐渐实现。

2、怎样后台播放音乐。第风姿罗曼蒂克版先后未有实现此成效,好来开掘,然后经过service终于完成之。

3、响铃。怎么样抉择自身有本性的铃铛,到后日还未实现,只好播放一种自己事情发生早先安装好响铃。

4、自定义适配器。此前都是用的系统提供的适配器,在那app中,音乐播放器模块貌似不行。

5、背景。如何选用好的背景图片,自然,和煦,有创新意识,那是个难点。

6、切图。图片接受不太完好,网络的图形都不太切合标准,缩短之后又失真,那是个难题。然后推荐给大家八个好的切图工具——光影魔术手

7、从SDXC存款和储蓄卡加载音乐。刚初阶是由此遍历PCIe闪存卡完成的,可是速度慢的吓人。后来,通过数据库就快多了。

 

 

最后,介绍下本项目标主导境况,没有用到第三方代码库,都以Android里面包车型客车库。

 

 

 

 

参照文书档案:   
TabActivity完成多页展现效果

    
使用Android
Lint Checks使您的运用更加强壮

  
消除Android工程中没用到的财富

    
textview字体颜色设置

        
Android学习笔记(三卡塔尔国开拓本身的简易MP4播放器

       Android音乐播放器(2)从SDHC卡中读取音乐

 
Android音乐播放器能源

 

 能源下载:

    情绪笔记app源码下载地址

  

 

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图