IntentService
IntentService的优点:不用开启线程
IntentService的缺点:使用广播向activity传值
IntentService,可以看做是Service和HandlerThread的结合体
IntentService 是继承自 Service 并处理异步请求的一个类,在 IntentService内有一个工作线程来处理耗时操作。
用法:自定义类继承IntentService
音乐播放器
效果图:
布局文件
// An highlighted block
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity">
<ListView
android:id="@+id/lv"
android:layout_weight="9"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@drawable/_103"
></ListView>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="80dp"
android:text="歌名"
android:textSize="20dp"
android:gravity="center"
/>
<RadioGroup
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
>
<RadioButton
android:layout_gravity="center"
android:textAlignment="center"
android:drawableTop="@drawable/shangyishou"
android:id="@+id/rb1"
android:text="上一首"
android:button="@null"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<CheckBox
android:layout_gravity="center"
android:textAlignment="center"
android:drawableTop="@drawable/share"
android:id="@+id/rb2"
android:text="播放"
android:button="@null"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/rb4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:button="@null"
android:drawableTop="@drawable/xiayishou24"
android:text="下一首"
android:textAlignment="center" />
</RadioGroup>
</LinearLayout>
listview布局文件
// An highlighted block
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
>
<ImageView
android:id="@+id/iv"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/yinle"
/>
<TextView
android:id="@+id/text1"
android:layout_width="30dp"
android:layout_height="100dp"
android:layout_toRightOf="@id/iv"
/>
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌名"
android:layout_toRightOf="@id/text1"
android:textSize="20dp"
/>
<TextView
android:id="@+id/text2"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_below="@id/tv1"
android:layout_toRightOf="@id/text1"
/>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌手"
android:layout_toRightOf="@id/text1"
android:layout_below="@id/text2"
/>
<TextView
android:id="@+id/tv3"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时长"
android:textSize="20dp"
/>
</RelativeLayout>
主类代码
// An highlighted block
package bw.com.day18;
import android.app.Service;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
RadioButton r1;
CheckBox r2;
RadioButton r4;
TextView textView;
int flag;
ContentResolver contentResolver;
ArrayList<Music> musics = new ArrayList<>();
ListView listView;
MyAdapter myAdapter;
Intent intent;
MusicService musicService;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
musicService = ((MusicService.MusicBinder)service).getServer();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.lv);
r1 = findViewById(R.id.rb1);
r2 = findViewById(R.id.rb2);
r4 = findViewById(R.id.rb4);
textView = findViewById(R.id.tv);
contentResolver = getContentResolver();
String[] strings ={MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATA};
Cursor query = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,strings,null,null,null);
while (query.moveToNext()){
String mname = query.getString(query.getColumnIndex(strings[0]));
String mman = query.getString(query.getColumnIndex(strings[1]));
long msum = query.getLong(query.getColumnIndex(strings[2]));
String maddr = query.getString(query.getColumnIndex(strings[3]));
Music music = new Music(mname,mman,msum,maddr);
musics.add(music);
}
myAdapter = new MyAdapter(MainActivity.this,musics);
listView.setAdapter(myAdapter);
myAdapter.notifyDataSetChanged();
intent = new Intent(MainActivity.this,MusicService.class);
bindService(intent,connection, Service.BIND_AUTO_CREATE);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
r2.setChecked(true);
r2.setText("暂停");
flag = position;
textView.setText(musics.get(position).getMusicname());
musicService.stop();
musicService.play(musics,position);
}
});
r1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
r2.setChecked(true);
if (flag == 0){
musicService.stop();
musicService.play(musics,musics.size()-1);
flag = musics.size()-1;
textView.setText(musics.get(flag).getMusicname());
}else{
flag--;
textView.setText(musics.get(flag).getMusicname());
musicService.stop();
musicService.play(musics,flag);
}
}
});
r2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (r2.isChecked()){
r2.setText("暂停");
textView.setText(musics.get(flag).getMusicname());
musicService.play(musics,0);
}else{
r2.setText("播放");
textView.setText("停止播放");
musicService.pause();
}
}
});
r4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
r2.setChecked(true);
r2.setText("暂停");
if (flag >= musics.size()-1){
musicService.stop();
musicService.play(musics,0);
flag = 0;
textView.setText(musics.get(flag).getMusicname());
}else{
flag++;
textView.setText(musics.get(flag).getMusicname());
musicService.stop();
musicService.play(musics,flag);
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}
Service代码
// An highlighted block
public class MusicService extends Service {
MediaPlayer mediaPlayer;
int current = 0;
@Override
public IBinder onBind(Intent intent) {
return new MusicBinder();
}
public class MusicBinder extends Binder{
public MusicService getServer(){
return MusicService.this;
}
}
//播放音乐
public void play(ArrayList<Music> musics,int index){
current = index;
try {
if (mediaPlayer == null){
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(musics.get(index).getMusicaddr());
mediaPlayer.prepare();
mediaPlayer.start();
}else{
mediaPlayer.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//暂停
public void pause(){
if (mediaPlayer!=null){
mediaPlayer.pause();
}
}
//停止
public void stop(){
if (mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
list适配器
// An highlighted block
public class MyAdapter extends BaseAdapter {
Context context;
ArrayList<Music> musics;
public MyAdapter(Context context, ArrayList<Music> musics) {
this.context = context;
this.musics = musics;
}
@Override
public int getCount() {
return musics.size();
}
@Override
public Object getItem(int position) {
return musics.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null){
viewHolder = new ViewHolder();
convertView = View.inflate(context,R.layout.layout_list,null);
viewHolder.textView1 = convertView.findViewById(R.id.tv1);
viewHolder.textView2 = convertView.findViewById(R.id.tv2);
viewHolder.textView3 = convertView.findViewById(R.id.tv3);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView1.setText(musics.get(position).getMusicname());
viewHolder.textView2.setText(musics.get(position).getMusicman());
viewHolder.textView3.setText(getTime(musics.get(position).getTime()));
return convertView;
}
class ViewHolder{
TextView textView1;
TextView textView2;
TextView textView3;
}
public String getTime(long l){
long sum = l / 1000;
int f= (int) (sum/60);
int m = (int) (sum%60);
String f1 = f+"";
String f2 = m+"";
if (f<10){
f1 = 0+""+f;
}
if (m<10){
f2 = 0+""+m;
}
return f1+":"+f2;
}
}
音乐类
// An highlighted block
package bw.com.day18;
public class Music {
String musicname;
String musicman;
long time;
String musicaddr;
public Music(String musicname, String musicman, long time, String musicaddr) {
this.musicname = musicname;
this.musicman = musicman;
this.time = time;
this.musicaddr = musicaddr;
}
public String getMusicname() {
return musicname;
}
public String getMusicman() {
return musicman;
}
public long getTime() {
return time;
}
public String getMusicaddr() {
return musicaddr;
}
public void setMusicname(String musicname) {
this.musicname = musicname;
}
public void setMusicman(String musicman) {
this.musicman = musicman;
}
public void setTime(long time) {
this.time = time;
}
public void setMusicaddr(String musicaddr) {
this.musicaddr = musicaddr;
}
}