作业2-recyclerView跳转与musicserver

Activity生命周期

进入触发oncreate-> onStart->onResume
在这里插入图片描述
退出触发 onPause->onStop->onDestroy
在这里插入图片描述

总结

  • onCreate()
    它会在系统首次创建 Activity 时触发。Activity 会在创建后进入“已创建”状态。
  • onStart()
    当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 方法会非常快速地完成,并且与“已创建”状态一样,Activity 不会一直处于“已开始”状态。一旦此回调结束,Activity 便会进入“已恢复”状态,系统将调用 onResume() 方法。
  • onResume()
    Activity 会在进入“已恢复”状态时来到前台,然后系统调用 onResume() 回调。这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭。
  • onPause()
    系统将此方法视为用户将要离开您的 Activity 的第一个标志此方法表示 Activity 不再位于前台,如果 Activity 从“已暂停”状态返回“已恢复”状态,系统将再次调用 onResume() 方法)
  • onStop()
    如果 Activity 不再对用户可见,说明其已进入“已停止”状态,应用应释放或调整在应用对用户不可见时的无用资源
  • onDestroy()
    销毁 Activity 之前,系统会先调用 onDestroy()。系统调用此回调
    1. Activity 即将结束(由于用户彻底关闭 Activity 或由于系统为 Activity 调用 finish()),或者
    2. 由于配置变更(例如设备旋转或多窗口模式),系统暂时销毁 Activity

recyclerView跳转

实现音乐列表,点击进入详情页面播放对应音乐
在这里插入图片描述
在这里插入图片描述

recyclerView部分(musicAdapter)

private void Viewinit() {
        context = this.getActivity();

        myadapter = new musicAdapter(context);
        //设置LayoutManager
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(myadapter);
        myadapter.list(namelist,artistlist,urllist,coverlist);
    }

musicadapter定义成员函数获取歌名,歌手,MP3链接,封面链接

 	private List<String> namelist;
    private List<String> artistlist;
    private List<String> urllist;
    private List<String> coverlist;


    public musicAdapter(Context context) {

        this.context = context;
    }

    public void list(List<String> namelist,List<String> artistlist,List<String> urllist,List<String> coverlist) {
        this.namelist=  namelist;
        this.artistlist= artistlist;
        this.urllist= urllist;
        this.coverlist= coverlist;
        notifyDataSetChanged();

    }

歌单json文件,包含 “name”,“artist”,“url”,“cover”,“lrc”

[“url”,“cover”,“lrc”]都是网络地址,拼接到https://cdn.unrun.top/blog/music/后面获取url
output.json放在raw文件夹下json格式如下

{"data":[{
    "name": "花の塔",
    "artist": "酸欠少女さユり",
    "url": "45.mp3",
    "cover": "45.jpg",
    "lrc": "45.lrc"
},
{
    "name": "星と君が消えた日",
    "artist": "泠鸢yousa",
    "url": "59.mp3",
    "cover": "59.jpg",
    "lrc": "59.lrc"
}]}

定义一个函数解析歌单json文件,先逐行读取为字符串然后解析

private void getjson(){
        InputStream stream=getResources().openRawResource(R.raw.output);
        BufferedReader reader=new BufferedReader(new InputStreamReader(stream));
        String jsonStr="",line="";
        try {
            while ((line=reader.readLine())!=null){
                jsonStr+=line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            JSONObject jsonObject1 = new JSONObject(jsonStr);
            JSONArray jsonArray = jsonObject1.getJSONArray("data");
            for(int i=0;i<jsonArray.length();i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String name = jsonObject.getString("name");
                String artist = jsonObject.getString("artist");
                String url = jsonObject.getString("url");
                String cover = jsonObject.getString("cover");
                String lrc = jsonObject.getString("lrc");
                namelist.add(name);
                artistlist.add(artist);
                urllist.add(url);
                coverlist.add(cover);
//                lrclist.add(lrc);
//                Log.d("f4", String.valueOf(list));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    

实例化musicadapter,并把歌曲信息传进去

private void Viewinit() {
        context = this.getActivity();
        myadapter = new musicAdapter(context);
        //设置LayoutManager
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(myadapter);
        myadapter.list(namelist,artistlist,urllist,coverlist);
    }

musicadapter中list函数获取,(上面写了)

 public void list(List<String> namelist... ){}

recyclerView单项的点击监听

onBindViewHolder中监听每一个linearLayout并通过postion作为list下标获取对应的歌曲信息,然后通过intent传入信息到歌曲详情页面

public void onBindViewHolder(@NonNull Myholder holder, @SuppressLint("RecyclerView") int position) {
        holder.music_name.setText(namelist.get(position));//转字符串
        holder.detail.setText(artistlist.get(position));
        Glide.with(context).load("https://cdn.unrun.top/blog/music/" + coverlist.get(position)).into(holder.imageView_avarat);
        holder.linearLayout_music.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(itemview.getContext(), position + "号:" + list.get(position), Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(holder.itemView.getContext(), MainActivity2.class);
                intent.putExtra("position",""+position);
                intent.putExtra("namelist",namelist.get(position));
                intent.putExtra("artistlist",artistlist.get(position));
                intent.putExtra("coverlist",coverlist.get(position));
                intent.putExtra("urllist",urllist.get(position));
                context.startActivity(intent);
                //onSwiped(position);
            }
        });
    }

歌曲详情页

MainActivity2(歌曲详情页)中获取(position定义了全局私有变量)

		Intent intent=getIntent();
        position=intent.getStringExtra("position");
        String name=intent.getStringExtra("namelist");
        String artist=intent.getStringExtra("artistlist");
        String cover=intent.getStringExtra("coverlist");

歌曲信息直接显示出来

TextView textView_main2_01=findViewById(R.id.textView_main2_01);
textView_main2_01.setText(position+"\n"+name+"\n"+artist+"\n"+cover);

网络图片通过Glide库显示

Glide.with(context).load("https://cdn.unrun.top/blog/music/" +cover).into(imageView_music);

实例化musicserver通过intent把MP3的url和seekbar传进去。(后面写musicserver对应的函数)
一个按钮实现播放暂停的切换,定义一个flag默认是0,监听按钮,

  • 如果flag==0就播放音乐,把按钮文字改为暂停,flag置1
  • 如果flag==1就暂停音乐,把按钮文字改为播放,flag置0
private void play( ) {
        musicserver=new MyService();
        Log.d("xxxx",url);
        btb_start = findViewById(R.id.button_start);
        seekBar=findViewById(R.id.seekBar);
        musicserver.getseekBar(seekBar);

        final int[] flag = {0};
        intent1 = new Intent(this,MyService.class);
        btb_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (flag[0] ==0){
                    intent1.putExtra("url",url);
                    startService(intent1);
                    btb_start.setText("暂停");
                    flag[0]++;
                }else if(flag[0] ==1){
                    stopService(intent1);
                    btb_start.setText("开始");
                    flag[0]--;
                }
            }
        });
    }

music server部分

musicserver获取seekbar(虽然暂时用不到)

 public void getseekBar(SeekBar seekBar){
        this.seekBar=seekBar;
    }

由于server的onCreate发生在onStartCommand前面,MP3的url又要在onStartCommand获取,所有new操作不能放在onCreate中,通过公共函数启动实例化

  public MyService() {
        mediaPlayer=new MediaPlayer();
    }

onStartCommand中通过先实例化然后setDataSource与start(这几个先后顺序不能变)

url=(String) intent.getExtras().get("url");
        Log.d("geturl",url);
        try {
           mediaPlayer.setDataSource("https://cdn.unrun.top/blog/music/"+url);
            Log.d("mm","https://cdn.unrun.top/blog/music/"+url);
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    int time=mediaPlayer.getDuration();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        return super.onStartCommand(intent, flags, startId);
    }

多个音频会一起播放暂时的解决方法onDestroy时自动暂停

@Override
    protected void onDestroy() {
        super.onDestroy();
        stopService(intent1);
        Log.d("twh","onDestroy");
    }

ActivityForResult功能

Fragment1.java->ActivityForResult.java

Fragment1.java代码

 button01.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("ss", "1->2ok");
            Intent intent = new Intent(getActivity(), ActivityForResult.class);
            tested.launch(intent);
        }
    });
}
public ActivityResultLauncher<Intent> tested= registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>(){
            @Override
            public void onActivityResult(ActivityResult result ) {
                if(result.getResultCode()==Activity.RESULT_OK){
                    text1.setText(result.getData().getStringExtra("msg"));
                }
            }
        }
);

ActivityForResult.java代码

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent();
        intent.putExtra("msg", "ActivityForResult发送 finish");
        setResult(Activity.RESULT_OK, intent);
        finish();
    }
结果

在这里插入图片描述

绑定式的server

activity文件,一个按钮绑定,一个解绑

  intent2 = new Intent(this,MyService.class);
        Button button_bond=findViewById(R.id.button_bond);
        Button button_unbond=findViewById(R.id.button_unbond);

        ServiceConnection connection=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                mybinder =(MyService.Mybinder)iBinder;
                mybinder.myplay();
            }
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                mybinder=null;
            }
        };
        button_bond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                bindService(intent2,connection,Context.BIND_AUTO_CREATE);
            }
        });
        button_unbond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                unbindService(connection);
            }
        });

server文件中
继承Binder的自定义类,其函数myplay()写播放方法

 class Mybinder extends Binder{
        public  void  myplay(){
            mediaPlayer=MediaPlayer.create(getApplicationContext(),R.raw.flower);
            mediaPlayer.start();
        }
    }

演示

在这里插入图片描述

点击绑定开始播放歌曲,点击解绑暂停歌曲

完整音乐列表功能
在这里插入图片描述

代码仓库

https://github.com/2412322029/Applicationtest

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值