溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android切近實戰(六)

發布時間:2020-08-03 18:19:05 來源:網絡 閱讀:1070 作者:BruceAndLee 欄目:移動開發

上節我們講述了用戶管理,本節我們講述一下短消息管理,先看一下C#版本的界面

Android切近實戰(六)

今天就是要將這個翻譯成Android版本,不過這個C#版本只是將數據存到數據庫,等用戶登錄的時候,如果發現有新消息,就會在屏幕的下方彈出短消息提示,并且播放聲音“您有新短消息,請注意查收”,這個在本節不會講到,請關注下節。


我們先看一下Android的界面,還是不錯的,本次的測試機是小米2A,老婆的機子,我可憐是幾年前買的Nokia 510。

Android切近實戰(六)

這個界面的功能是用戶在界面選擇一個別的用戶,然后在輸入標題和內容,點擊發送按鈕,發送短信到選擇的用戶的手機上,并同時將發送的數據插入數據庫中,今天我們只看手機發送這部分。


首先我們先看一下WebService端,如下,我們新增了一個獲取其他user信息的webservice

Android切近實戰(六)


代碼如下,首先是WebService

 [WebMethod(Description = "獲取其他用戶")]
        public List<UserInfoEntity> GetOtherUser(string userID)
        {
            return UserInfoBiz.GetInstance().GetOtherUser(userID);
        }

接下來是Biz層

public List<UserInfoEntity> GetOtherUser(string userID)
        {
            return UserInfoMngDAL.GetInstance().GetOtherUser(userID);
        }

最后是DAL層

public List<UserInfoEntity> GetOtherUser(string userID)
        {
            using (BonusEntities bonusEntities = new BonusEntities())
            {
                List<UerInfo> userInfoList = bonusEntities.UerInfo.AsEnumerable().Where(u => u.UseNo != userID
                    && !string.IsNullOrWhiteSpace(u.Name)
                    && u.RUserTel != null
                    && !string.IsNullOrWhiteSpace(u.RUserTel.TelNumber))
                    .ToList();

                List<UserInfoEntity> otherUserInfoList = new List<UserInfoEntity>();

                userInfoList.ForEach(u =>
                {
                    otherUserInfoList.Add(new UserInfoEntity() 
                    { 
                        UserNo = u.UseNo, 
                        UserName = u.Name, 
                        TelNumber = u.RUserTel.TelNumber 
                    });
                });

                return otherUserInfoList;
            }
        }


OK,在這里我們新增了一張表,是UserInfo和UserTel的關系表

Android切近實戰(六)

所以上面的WebService是查詢出除當前user以外所有的有姓名并且有電話號碼的用戶,在這里我們做的是1對多的關系,當然了,也有可能某些用戶是多個手機。這里為了方便,就1對多。


WebService端看完了,我們看一下Android客戶端,先看布局吧,我們在layout下面新增一個布局文件叫sendmessage.xml

<?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="@color/red1" android:orientation="vertical">
	<TableLayout android:layout_width="fill_parent"
		android:layout_margin="1dp" 
		android:layout_height="wrap_content"
		android:stretchColumns="1"
		android:shrinkColumns="1"
		android:background="@color/teal">
		<TableRow>
			<TextView android:text="@string/labReceiveUser"
				android:layout_gravity="center_vertical"
				 android:textSize="8pt"></TextView>
			<Spinner android:id="@+id/spOtherUser"
			android:layout_gravity="center_vertical"></Spinner>
		</TableRow>
		<TableRow>
			<TextView android:text="@string/labMsgTitle"
				android:layout_gravity="center_vertical"
				android:gravity="right" 
				android:textSize="8pt"></TextView>
			<EditText android:id="@+id/txtMsgTitle" android:singleLine="true"
				android:layout_gravity="center_vertical"
				android:drawableLeft="@drawable/msgtitle"
				android:hint="@string/hintMsgInput" android:maxLength="100"></EditText>
		</TableRow>
		<TableRow>
			<TextView android:text="@string/labMsgContent"
				android:gravity="right"
				android:layout_gravity="center_vertical" 
				android:textSize="8pt"></TextView>
			<EditText android:id="@+id/txtMsgContent"
				android:layout_gravity="center_vertical"
				android:layout_width="wrap_content"
				android:lines="4"
				android:maxLines="4"
				android:textColor="@color/purplered"
				android:drawableLeft="@drawable/message" android:maxLength="1000"></EditText>
		</TableRow>
	</TableLayout>
	<LinearLayout android:orientation="horizontal"
		android:background="@color/teal" android:layout_margin="1dp"
		android:layout_width="fill_parent" android:layout_height="wrap_content">
		<ImageButton android:id="@+id/btnSend"
			android:layout_marginTop="5dp"
			android:layout_width="wrap_content" android:layout_height="60dp"
			android:src="@drawable/sendmessage" android:layout_weight="1"
			android:scaleType="centerInside"></ImageButton>
		<ImageButton android:id="@+id/btnCancel"
			android:layout_marginTop="5dp"
			android:layout_width="wrap_content" android:layout_height="60dp"
			android:src="@drawable/cancel" android:layout_weight="1"
			android:scaleType="centerInside"></ImageButton>
	</LinearLayout>
</LinearLayout>

還是Table布局,出來的效果就是第一幅圖,在這個布局中,我們發現TableLayout的stretchColumns="1"并且shrinkColumns也是1。為什么么設置呢,因為如果不這樣設置。文本框中的字會將文本框的寬度撐大,撐到屏幕外面去。所以,加上這兩個屬性,既可以保證鋪滿,又可以保證不超出屏幕。


接下來我們看一下后臺,在頁面創建完成后,有一個InitReceiveUser方法,這個方法就是獲取其他userf信息并加載到Spinner的方法,我們來看一下

private void InitReceiveUser() {
		Bundle bundle = getIntent().getExtras();
		String userNo = bundle.getString("userNo");

		SoapObject soapObject = this.GetOtherUserList(userNo);
		for (int i = 0; i < soapObject.getPropertyCount(); i++) {
			SoapObject soapObj = (SoapObject) soapObject.getProperty(i);

			userInfoEntity = new UserInfoEntity();
			userInfoEntity.setProperty(0, soapObj.getProperty("UserNo"));
			userInfoEntity.setProperty(1, soapObj.getProperty("UserName"));
			userInfoEntity.setProperty(7, soapObj.getProperty("TelNumber"));
			userInfoEntityList.add(userInfoEntity);
		}

		CustomArrayAdapter customAdapter = new CustomArrayAdapter(this,
				userInfoEntityList);
		spOtherUser.setAdapter(customAdapter);
		spOtherUser.setPrompt("請選擇接收人");

		spOtherUser.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int position, long arg3) {

				if (!isFirstLoad) {
					isFirstLoad = true;
					return;
				}

				// TODO Auto-generated method stub
				UserInfoEntity userInfoEntity = userInfoEntityList
						.get(position);
				String userName = userInfoEntity.getProperty(1).toString();
				String telNumber = userInfoEntity.getProperty(7).toString();

				Toast toast = Toast.makeText(getApplicationContext(), "姓名:"
						+ userName + ",電話:" + telNumber, Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);

				LinearLayout toastContentView = (LinearLayout) toast.getView();
				ImageView imgToast = new ImageView(getApplicationContext());
				imgToast.setImageResource(R.drawable.receiveuser);
				toastContentView.addView(imgToast, 0);
				toast.show();
			}
		});
	}

首先我們會拿到index界面傳過來的userNo,然后調用webService得到一個UserInfoEntityList,這一步相當于我們已經有了數據源。接下來我們看到了CustomArrayAdapter類,這個類是干什么的,記得上篇文章我說過,Spinner可以像Silverlight中的ComboBox一樣設置模版,來顯示比較復雜的內容。我們先看一下效果圖

Android切近實戰(六)

我們發現這個內容比上篇文章中的性別絢麗多了,不錯,這就是要通過自定義適配器實現。

public class CustomArrayAdapter extends BaseAdapter {
	private List<UserInfoEntity> userInfoEntities;
	private Context context;

	public CustomArrayAdapter(Context context, List<UserInfoEntity> userInfoEntities) {
		this.context = context;
		this.userInfoEntities = userInfoEntities;
	}

	@Override
	public int getCount() {
		return userInfoEntities.size();
	}

	@Override
	public Object getItem(int position) {
		return userInfoEntities.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	//@Override
	public View getView(int position, View contentView, ViewGroup parent) {
		LayoutInflater _LayoutInflater = LayoutInflater.from(context);
		contentView = _LayoutInflater.inflate(R.layout.spinner_userinfotemplate, null);

		if (contentView != null) {
			TextView txtUserName = (TextView)contentView
					.findViewById(R.id.txtUserName);

			TextView txtTelNumber = (TextView)contentView
					.findViewById(R.id.txtTelNumber);

			txtUserName.setText(userInfoEntities.get(position).getProperty(1).toString());

			txtTelNumber.setText(userInfoEntities.get(position).getProperty(7).toString());

		}
		return contentView;
	}
}

OK,就是上面的這個自定義Adapter。意思就是將傳遞進來的數據源綁定到各個模版控件,這個上篇也講過,這里不再贅述。OK,我們看一下模版(R.layout.spinner_userinfotemplate)的定義。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent" android:layout_height="match_parent">
	<TextView android:id="@+id/txtUserName" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:drawableLeft="@drawable/userhint"
		android:textColor="@color/red1"
		android:paddingRight="8dp" android:paddingTop="8dp" android:textSize="6pt" />
	<TextView android:id="@+id/txtTelNumber" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:textSize="6pt"
		android:textColor="@color/purplered">
	</TextView>
</LinearLayout>

OK,正是這兩個文本框來負責下拉選項的展示。所以我們將適配器應用于Spinner,效果就出來了。

CustomArrayAdapter customAdapter = new CustomArrayAdapter(this,
				userInfoEntityList);
		spOtherUser.setAdapter(customAdapter);

再往下看的話,就到了setOnItemSelectedListener事件,這個事件顧名思義,就是選擇了選項之后觸發,但是必須是在選擇了和當前呈現的選項不同的選項之后才會觸發,類似于Silverlight中的SelectionChanged事件。OK,在這個事件中,我們根據當前點擊的行號,拿到對象,再取出姓名和手機號碼。渲染一個toast并顯示。效果如下

Android切近實戰(六)

我靠,超人。在這里,你如果想讓這些超人在界面上停留的事件長點,就設置這句

Toast.LENGTH_LONG
Toast toast = Toast.makeText(getApplicationContext(), "姓名:"
						+ userName + ",電話:" + telNumber, Toast.LENGTH_LONG);

如果你想讓他停留的短的話,就設置成Toast.LENGTH_SHORT。


這部分看完之后,就到了我們的重頭戲,發送短信。就是左邊那個按鈕,右邊那個是退出按鈕

		btnCancel.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				sendmessage.this.setResult(RESULT_OK);
				sendmessage.this.finish();
			}
		});

我們看一下發送按鈕的代碼

btnSend.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				SmsManager smsManager = SmsManager.getDefault();

				UserInfoEntity userInfoEntity = (UserInfoEntity) spOtherUser
						.getSelectedItem();
				String messageAddress = userInfoEntity.getProperty(7)
						.toString(); // 電話號碼
				String messageContent = txtContent.getText().toString().trim();

				if (messageAddress.trim().length() != 0
						&& messageContent.trim().length() != 0) {
					try {
						PendingIntent pintent = PendingIntent.getBroadcast(
								sendmessage.this, 0, new Intent(), 0);

						if (messageContent.length() > 70) {
							List<String> messageList = smsManager
									.divideMessage(messageContent);

							for (String strMsg : messageList) {
								smsManager.sendTextMessage(messageAddress,
										null, strMsg, pintent, null);
							}
						} else {
							smsManager.sendTextMessage(messageAddress, null,
									messageContent, pintent, null);
						}

					} catch (Exception e) {
						e.printStackTrace();
					}

					Toast.makeText(getApplicationContext(), "發送成功",
							Toast.LENGTH_LONG).show();
				}
			}
		});

在這里要使用SmsManager類,注意這個類需要引用的包名是import android.telephony.SmsManager;如果你引用的是android.telephony.gsm的話,意味著你的這個功能不能支持CDMA手機。android.telephony.SmsManager這個類是可以同時支持CDMA和GSM的。接著看,這段代碼先拿到Spinner中選擇的用戶的手機號碼,再從界面上拿到短消息的內容。然后就是這個pendingIntent,這個東西是對Intent的再包裝,它不是立刻執行某個行為,而是滿足某些條件或觸發某些事件后才執行指定的行為。

這個等后面逐漸深入了,再討論這個問題。PendingIntent構造好了之后,判斷輸入的短信是否大于70個字,如果大于70個字,是要分開發送的。最后調用發送短信的方法

sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);


第一個參數:destinationAddress 對方手機號碼

第二個參數:scAddress短信中心號碼 設置為空

第三個參數:text短信內容

第四個參數:sentIntent判斷短信是否發送成功,如果你沒有插入SIM卡,或者網絡中斷,則可以通過這個intent來判斷。注意強調的是“發送”的動作是否成功。那么至于對于對方是否收到,另當別論

第五個參數:deliveryIntent當短信發送到收件人時,會收到這個deliveryIntent。即強調了“發送”后的結果


為了簡單起見,我先不做這個發送后收到回執的功能。


就是說是在"短信發送成功"和"對方收到此短信"才會激活 sentIntent和deliveryIntent這兩個Intent。這也相當于是延遲執行了Intent


OK,我們發送一下試試,因為這里的標題是用來存入數據庫的,所以在這里不輸入

Android切近實戰(六)

點擊發送,小米會彈出是否發送的安全確認,點擊確認試試,還完了說了最后一步,要把權限打開

在AndroidManifest.xml文件中,新增如下的節點,允許調用發短信功能

<uses-permission android:name="android.permission.SEND_SMS"/>

成功了還是沒有呢

Android切近實戰(六)

這是老夫的windows phone Nokia 510??磥硎浅晒α?,進去看看是不是剛才那條短信

Android切近實戰(六)

這個是我拍的照,果然成功了,就是那個笑臉么出來。好吧,今天就到這里,下節主要就是短消息管理了,敬請期待。


他大舅他二舅都是他舅,高桌子低板凳都是木頭,進來的都是干這行的,評價一下吧。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女