一直对移动端开发有些兴趣,但苦于不会Java,好在终于找到了个好玩的。
安装方法略了,先建立一个玩玩
不多说,贴代码了,需要注意的只有些JAVA和C#写法不太一样的地方,不细介绍了,因为没什么经验,乱试的,所以也没什么规范,随便看看就好
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Java.Util; namespace AndroidHotelServiceTest { [Activity(Label = "My Activity")] public class ActivityCalendar : Activity { protected override Dialog OnCreateDialog(int id) { if (id == 1) { return new DatePickerDialog(this, new DDialogLisetener(this), 2013, 11, 11); } return base.OnCreateDialog(0); } protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Create your application here SetContentView(Resource.Layout.CalendarView); Button button = FindViewById<Button>(Resource.Id.btClose); button.Click += delegate { Intent intent = new Intent(); intent.SetClass(this, typeof(ActivityHotel)); StartActivity(intent); }; ShowDialog(1); } } public class DDialogLisetener : DatePickerDialog.IOnDateSetListener { private Context _context; public DDialogLisetener(Context context) { _context = context; } public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { String sDayOfWeek = getDayOfWeek(year, monthOfYear, dayOfMonth); //Toast.makeText(CreateParty.this, "sdf", Toast.LENGTH_LONG).show(); int m_nYear = year; int m_nMonth = monthOfYear + 1; int m_nDay = dayOfMonth; Toast.MakeText(_context, "ddd", ToastLength.Long).Show(); Toast.MakeText(_context, m_nYear + "年" + m_nMonth + "月" + m_nDay + "日 ", ToastLength.Long).Show(); } private string getDayOfWeek(int tmpYear, int tmpMonth, int tmpDay) { String myWeek = null; String sYear = tmpYear.ToString(); // 取年的后两位 String sYearTwo = sYear.Substring(sYear.Length - 2); int y = tmpYear; int m = tmpMonth + 1; int c = 20; int d = tmpDay; int w = (y + (y / 4) + (c / 4) - 2 * c + (26 * (m + 1) / 10) + d - 1) % 7; switch (w) { case 0: myWeek = "日"; break; case 1: myWeek = "一"; break; case 2: myWeek = "二"; break; case 3: myWeek = "三"; break; case 4: myWeek = "四"; break; case 5: myWeek = "五"; break; case 6: myWeek = "六"; break; default: break; } return myWeek; } public void Dispose() { this.Dispose(); } public IntPtr Handle { get { return IntPtr.Zero; } } } }
参考了不少网上的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Media;
using Android.Content.Res;
using Java.IO;
namespace AndroidHotelServiceTest
{
public class BeepManager
{
private static Activity m_CurrentActivity;
private static MediaPlayer m_MediaPlayer = null;
private static MediaPlayer BuildMediaPlayer(Context context)
{
MediaPlayer player = new MediaPlayer();
player.SetAudioStreamType(Android.Media.Stream.Music);
player.Completion += new EventHandler(mediaplayer_Completion);
AssetFileDescriptor assetfiledescriptor = context.Resources.OpenRawResourceFd(0x7f040000);
try
{
player.SetDataSource(assetfiledescriptor.FileDescriptor, assetfiledescriptor.StartOffset, assetfiledescriptor.Length);
assetfiledescriptor.Close();
player.SetVolume(0.1F, 0.1F);
player.Prepare();
m_MediaPlayer = player;
}
catch (IOException ioexception)
{
player = null;
}
return player;
}
static void mediaplayer_Completion(object sender, EventArgs e)
{
m_MediaPlayer.SeekTo(0);
}
public static void PlayBeepSound(Activity activity)
{
m_CurrentActivity = activity;
if (m_MediaPlayer == null)
{
m_MediaPlayer = BuildMediaPlayer(m_CurrentActivity);
}
m_MediaPlayer.Start();
}
public static void Stop()
{
if (m_MediaPlayer != null)
{
m_MediaPlayer.Stop();
m_MediaPlayer = null;
}
}
//private void prepareToPlay()
//{
// try
// {
// //获取当前音频流的路径后我们需要通过MediaPlayer的setDataSource来设置,然后调用prepareAsync()来完成缓存加载
// String path = pathList.get(currPosition);
// player.setDataSource(path);
// //之所以使用prepareAsync是因为该方法是异步的,因为访问音频流是网络操作,在缓冲和准备播放时需要花费
// //较长的时间,这样用户界面就可能出现卡死的现象
// //该方法执行完成后,会执行onPreparedListener的onPrepared()方法。
// player.prepareAsync();
// }
// catch (IllegalArgumentException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// catch (IllegalStateException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// catch (IOException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//}
}
}
调用WCF验证登陆
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using System.ServiceModel; using System.Threading; namespace AndroidHotelServiceTest { [Activity(Label = "登陆", MainLauncher = true)] public class ActivityLogin : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Login); // Create your application here Button button = FindViewById<Button>(Resource.Id.login); EditText txtUser = FindViewById<EditText>(Resource.Id.edtuser); EditText txtPassword = FindViewById<EditText>(Resource.Id.edtpsd); button.Click += delegate { Login(txtUser.Text, txtPassword.Text); }; } public void Login(string user, string password) { BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None); var timeout = new TimeSpan(0, 1, 0); binding.SendTimeout = timeout; binding.OpenTimeout = timeout; binding.ReceiveTimeout = timeout; IHotelService service = ChannelFactory<IHotelService>.CreateChannel(binding, new EndpointAddress("http://172.25.16.50:90/HotelService.svc")); string loginUser = service.Login(user, password); if (!string.IsNullOrEmpty(loginUser)) { Intent intent = new Intent(); intent.SetClass(this, typeof(ActivityHotel)); intent.PutExtra("User", user); StartActivity(intent); } } } }
总之,大概就这样了,页面布局什么的也没什么特别的。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:minWidth="25px" android:minHeight="25px"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="账号:" /> <EditText android:layout_width="240dip" android:layout_height="wrap_content" android:text="aaa" android:id="@+id/edtuser" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码:" /> <EditText android:layout_width="240dip" android:layout_height="wrap_content" android:password="true" android:id="@+id/edtpsd" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:orientation="vertical"> <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="记住密码" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="登录" /> </LinearLayout> </LinearLayout> </LinearLayout>
至于服务端,就是VS自动生成的代码加了一个登陆判断而已
[ServiceContract] public interface IHotelService { [OperationContract] string Login(string user, string password); }