android studio 3.0 service項(xiàng)目背景音樂(lè)實(shí)現(xiàn)
這篇文章是博主在通過(guò)學(xué)習(xí)Android Studio的同時(shí),實(shí)現(xiàn)service項(xiàng)目中用于背景音樂(lè)的實(shí)現(xiàn),郵件的發(fā)送用于隨堂小測(cè)的發(fā)送郵件功能。其中也碰到需要坑和錯(cuò)誤,最后都解決了,一起跟著學(xué)習(xí)一下吧。如果大家有更好的方法可以在下面的留言區(qū)討論。
本次項(xiàng)目我主要負(fù)責(zé)Android studio的后端,以及游戲文案游戲策劃,結(jié)果后來(lái)事情太散了,Android studio學(xué)的不咋地,文案寫(xiě)完還有幫著寫(xiě)一寫(xiě)數(shù)據(jù)庫(kù)的插入語(yǔ)句,然后就是跟隊(duì)友完成了as的后臺(tái)插入聲音的代碼。接下來(lái)介紹的service項(xiàng)目中用于背景音樂(lè)的實(shí)現(xiàn),郵件的發(fā)送用于隨堂小測(cè)的發(fā)送郵件。
開(kāi)發(fā)基礎(chǔ)之Service
Activity可以呈現(xiàn)一個(gè)用戶(hù)界面,但是Service運(yùn)行在后臺(tái),試了以下實(shí)例,啟動(dòng)Service,并通過(guò)從Activity向Service傳遞數(shù)據(jù)。
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="默認(rèn)信息?。?!"; 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是參數(shù)里的,不是自定義的 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,"請(qǐng)輸入傳遞的值!",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); } }); } }
以此來(lái)完成Activity向Service傳遞數(shù)據(jù)的任務(wù)。
之后嘗試了as中間去實(shí)現(xiàn)音樂(lè)播放器,參考第一行代碼p303-307。
先寫(xiě)入布局代碼,三個(gè)按鈕用來(lái)播放,停止,暫停
<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與音頻播放結(jié)合,寫(xiě)了一個(gè)可以再主界面播放的背景音樂(lè):
此界面一打開(kāi)就有音樂(lè):
開(kāi)發(fā)過(guò)程學(xué)到的郵件發(fā)送
這個(gè)在上一次的隨堂小測(cè)中間有用到。
public class Main { public static String myEmailAccount = "929585831@qq.com"; public static String myEmailPassword = "uhszzhgojydfbbec"; // 授權(quán)碼 public static String myEmailSMTPHost = "smtp.qq.com"; // 收件人郵箱 public static String receiveMailAccount = "541227688@qq.com"; public static void main(String[] args) throws Exception { // 1. 創(chuàng)建參數(shù)配置, 用于連接郵件服務(wù)器的參數(shù)配置 Properties props = new Properties(); // 參數(shù)配置 props.setProperty("mail.transport.protocol", "smtp"); // 使用的協(xié)議(JavaMail規(guī)范要求) props.setProperty("mail.smtp.host", myEmailSMTPHost); // 發(fā)件人的郵箱的 SMTP 服務(wù)器地址 props.setProperty("mail.smtp.auth", "true"); // 需要請(qǐng)求認(rèn)證 // SMTP 服務(wù)器的端口 , // 需要改為對(duì)應(yīng)郵箱的 SMTP 服務(wù)器的端口, 具體可查看對(duì)應(yīng)郵箱服務(wù)的幫助, // 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. 根據(jù)配置創(chuàng)建會(huì)話對(duì)象, 用于和郵件服務(wù)器交互 Session session = Session.getInstance(props); session.setDebug(true); // 設(shè)置為debug模式, 可以查看詳細(xì)的發(fā)送 log int i=0; //寫(xiě)了個(gè)小循環(huán)舍友連收30份垃圾郵件emmm for(i=0;i<30;i++) { // 3. 創(chuàng)建一封郵件 MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount); // 4. 根據(jù) Session 獲取郵件傳輸對(duì)象 Transport transport = session.getTransport(); // 5. 使用 郵箱賬號(hào) 和 密碼 連接郵件服務(wù)器, 這里認(rèn)證的郵箱必須與 message 中的發(fā)件人郵箱一致, 否則報(bào)錯(cuò) transport.connect(myEmailAccount, myEmailPassword); // 6. 發(fā)送郵件, 發(fā)到所有的收件地址, message.getAllRecipients() 獲取到的是在創(chuàng)建郵件對(duì)象時(shí)添加的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 關(guān)閉連接 transport.close(); } } /** * 創(chuàng)建一封只包含文本的簡(jiǎn)單郵件 * * @param session 和服務(wù)器交互的會(huì)話 * @param sendMail 發(fā)件人郵箱 * @param receiveMail 收件人郵箱 * @return * @throws Exception */ public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception { // 1. 創(chuàng)建一封郵件 MimeMessage message = new MimeMessage(session); // 2. From: 發(fā)件人(昵稱(chēng)有廣告嫌疑,避免被郵件服務(wù)器誤認(rèn)為是濫發(fā)廣告以至返回失敗,請(qǐng)修改昵稱(chēng)) message.setFrom(new InternetAddress(sendMail, "you father", "UTF-8")); // 3. To: 收件人(可以增加多個(gè)收件人、抄送、密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用戶(hù)", "UTF-8")); // 4. Subject: 郵件主題(標(biāo)題有廣告嫌疑,避免被郵件服務(wù)器誤認(rèn)為是濫發(fā)廣告以至返回失敗,請(qǐng)修改標(biāo)題) message.setSubject("打折鉅惠", "UTF-8"); // 5. Content: 郵件正文(可以使用html標(biāo)簽)(內(nèi)容有廣告嫌疑,避免被郵件服務(wù)器誤認(rèn)為是濫發(fā)廣告以至返回失敗,請(qǐng)修改發(fā)送內(nèi)容) message.setContent("新疆人用戶(hù)你好,快來(lái)買(mǎi)鞋,今天全場(chǎng)5折, 快來(lái)?yè)屬?gòu), 錯(cuò)過(guò)今天再等一年。。。emmm軟工實(shí)踐測(cè)試郵件", "text/html;charset=UTF-8"); // 6. 設(shè)置發(fā)件時(shí)間 message.setSentDate(new Date()); // 7. 保存設(shè)置 message.saveChanges(); return message; }
如果本文大家還是有沒(méi)有理解,可以參考另外一篇相關(guān)文章:
相關(guān)文章
Android項(xiàng)目中g(shù)radle的執(zhí)行流程
大家好,本篇文章主要講的是Android項(xiàng)目中g(shù)radle的執(zhí)行流程,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Android 彈出Dialog時(shí)隱藏狀態(tài)欄和底部導(dǎo)航欄的方法
這篇文章主要介紹了Android 彈出Dialog時(shí)隱藏狀態(tài)欄和底部導(dǎo)航欄的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07flutter 輸入框組件TextField的實(shí)現(xiàn)代碼
這篇文章主要介紹了flutter 輸入框組件TextField的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法
本篇文章主要介紹了Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android開(kāi)發(fā)實(shí)現(xiàn)跟隨手指的小球效果示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)跟隨手指的小球效果,涉及Android圖形繪制、事件響應(yīng)、界面布局等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04Android基于注解的6.0權(quán)限動(dòng)態(tài)請(qǐng)求框架詳解
這篇文章主要介紹了Android基于注解的6.0權(quán)限動(dòng)態(tài)請(qǐng)求框架詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Flutter彈性布局Flex水平排列Row垂直排列Column使用示例
這篇文章主要為大家介紹了Flutter彈性布局Flex水平排列Row垂直排列Column使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Android簡(jiǎn)易電話撥號(hào)器實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了Android簡(jiǎn)易電話撥號(hào)器實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Flutter中數(shù)據(jù)庫(kù)的使用教程詳解
在Flutter開(kāi)發(fā)過(guò)程中,有時(shí)需要對(duì)數(shù)據(jù)進(jìn)行本地的持久化存儲(chǔ),使用sp文件形式雖然也能解決問(wèn)題,但是有時(shí)數(shù)據(jù)量較大的時(shí)候,顯然我們文件形式就不太合適了,這時(shí)候我們就需要使用數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)。本文將詳細(xì)講講Flutter中數(shù)據(jù)庫(kù)的使用,需要的可以參考一下2022-04-04Android 畫(huà)一個(gè)太極圖實(shí)例代碼
這篇文章主要介紹了Android 畫(huà)一個(gè)太極圖實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09