android studio 3.0 service项目背景音乐实现
程序员文章站
2023-11-17 19:55:40
这篇文章是博主在通过学习android studio的同时,实现service项目中用于背景音乐的实现,邮件的发送用于随堂小测的发送邮件功能。其中也碰到需要坑和错误,最后都...
这篇文章是博主在通过学习android studio的同时,实现service项目中用于背景音乐的实现,邮件的发送用于随堂小测的发送邮件功能。其中也碰到需要坑和错误,最后都解决了,一起跟着学习一下吧。如果大家有更好的方法可以在下面的留言区讨论。
本次项目我主要负责android studio的后端,以及游戏文案游戏策划,结果后来事情太散了,android studio学的不咋地,文案写完还有帮着写一写数据库的插入语句,然后就是跟队友完成了as的后台插入声音的代码。接下来介绍的service项目中用于背景音乐的实现,邮件的发送用于随堂小测的发送邮件。
开发基础之service
activity可以呈现一个用户界面,但是service运行在后台,试了以下实例,启动service,并通过从activity向service传递数据。
package com.example.lhb.startservice; import android.app.service; import android.content.intent; import android.os.ibinder; import android.view.viewdebug; import android.widget.toast; public class myservice extends service { private boolean running=false; private string data="默认信息!!!"; public myservice() { } @override public ibinder onbind(intent intent) { // todo: return the communication channel to the service. throw new unsupportedoperationexception("not yet implemented"); } @override public int onstartcommand(intent intent, int flags, int startid) { data=intent.getstringextra("data");//这里的intent是参数里的,不是自定义的 return super.onstartcommand(intent, flags, startid); } @override public void oncreate() { super.oncreate(); running=true; new thread(){ @override public void run() { super.run(); while (running){ system.out.println(data); try { sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } } } }.start(); } @override public void ondestroy() { super.ondestroy(); running=false; } } //主代码 package com.example.lhb.startservice; import android.content.intent; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.edittext; import android.widget.toast; public class mainactivity extends actionbaractivity { private edittext inputtext; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); findviewbyid(r.id.btnstartservice).setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { inputtext= (edittext) findviewbyid(r.id.inputtext); if(inputtext.gettext().length()==0){ toast.maketext(mainactivity.this,"请输入传递的值!",toast.length_short).show(); return; } intent intent; intent=new intent(mainactivity.this,myservice.class); intent.putextra("data",inputtext.gettext().tostring()); startservice(intent); } }); findviewbyid(r.id.btnstopservice).setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { intent intent; intent=new intent(mainactivity.this,myservice.class); stopservice(intent); } }); } }
以此来完成activity向service传递数据的任务。
之后尝试了as中间去实现音乐播放器,参考第一行代码p303-307。
先写入布局代码,三个按钮用来播放,停止,暂停
<relativelayout 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:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" android:paddingbottom="@dimen/activity_vertical_margin" tools:context=".mainactivity"> <textview android:text="音频播放器" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textview" /> <linearlayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/textview" android:layout_alignparentleft="true" android:layout_alignparentstart="true"> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" android:id="@+id/button" android:layout_weight="0.33" /> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" android:id="@+id/button2" android:layout_weight="0.33" /> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停" android:id="@+id/button3" android:layout_weight="0.33" /> </linearlayout> </relativelayout>
最后将service与音频播放结合,写了一个可以再主界面播放的背景音乐:
此界面一打开就有音乐:
开发过程学到的邮件发送
这个在上一次的随堂小测中间有用到。
public class main { public static string myemailaccount = "929585831@qq.com"; public static string myemailpassword = "uhszzhgojydfbbec"; // 授权码 public static string myemailsmtphost = "smtp.qq.com"; // 收件人邮箱 public static string receivemailaccount = "541227688@qq.com"; public static void main(string[] args) throws exception { // 1. 创建参数配置, 用于连接邮件服务器的参数配置 properties props = new properties(); // 参数配置 props.setproperty("mail.transport.protocol", "smtp"); // 使用的协议(javamail规范要求) props.setproperty("mail.smtp.host", myemailsmtphost); // 发件人的邮箱的 smtp 服务器地址 props.setproperty("mail.smtp.auth", "true"); // 需要请求认证 // smtp 服务器的端口 , // 需要改为对应邮箱的 smtp 服务器的端口, 具体可查看对应邮箱服务的帮助, // qq邮箱的smtp(sll)端口为465或587, 其他邮箱自行去查看) final string smtpport = "465"; props.setproperty("mail.smtp.port", smtpport); props.setproperty("mail.smtp.socketfactory.class", "javax.net.ssl.sslsocketfactory"); props.setproperty("mail.smtp.socketfactory.fallback", "false"); props.setproperty("mail.smtp.socketfactory.port", smtpport); // 2. 根据配置创建会话对象, 用于和邮件服务器交互 session session = session.getinstance(props); session.setdebug(true); // 设置为debug模式, 可以查看详细的发送 log int i=0; //写了个小循环舍友连收30份垃圾邮件emmm for(i=0;i<30;i++) { // 3. 创建一封邮件 mimemessage message = createmimemessage(session, myemailaccount, receivemailaccount); // 4. 根据 session 获取邮件传输对象 transport transport = session.gettransport(); // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错 transport.connect(myemailaccount, myemailpassword); // 6. 发送邮件, 发到所有的收件地址, message.getallrecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendmessage(message, message.getallrecipients()); // 7. 关闭连接 transport.close(); } } /** * 创建一封只包含文本的简单邮件 * * @param session 和服务器交互的会话 * @param sendmail 发件人邮箱 * @param receivemail 收件人邮箱 * @return * @throws exception */ public static mimemessage createmimemessage(session session, string sendmail, string receivemail) throws exception { // 1. 创建一封邮件 mimemessage message = new mimemessage(session); // 2. from: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称) message.setfrom(new internetaddress(sendmail, "you father", "utf-8")); // 3. to: 收件人(可以增加多个收件人、抄送、密送) message.setrecipient(mimemessage.recipienttype.to, new internetaddress(receivemail, "xx用户", "utf-8")); // 4. subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题) message.setsubject("打折钜惠", "utf-8"); // 5. content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容) message.setcontent("*人用户你好,快来买鞋,今天全场5折, 快来抢购, 错过今天再等一年。。。emmm软工实践测试邮件", "text/html;charset=utf-8"); // 6. 设置发件时间 message.setsentdate(new date()); // 7. 保存设置 message.savechanges(); return message; }
如果本文大家还是有没有理解,可以参考另外一篇相关文章:
上一篇: 浅谈RxJava+Retrofit+OkHttp 封装使用
下一篇: C#画笔Pen绘制曲线的方法