Android应用开发--MP3音乐播放器代码实现(二)

/**

  • 给每一个按钮设置监听器

*/

private void setViewOnclickListener() {

ViewOnClickListener viewOnClickListener = new ViewOnClickListener();

previousBtn.setOnClickListener(viewOnClickListener);

repeatBtn.setOnClickListener(viewOnClickListener);

playBtn.setOnClickListener(viewOnClickListener);

shuffleBtn.setOnClickListener(viewOnClickListener);

nextBtn.setOnClickListener(viewOnClickListener);

musicPlaying.setOnClickListener(viewOnClickListener);

}

private class ViewOnClickListener implements OnClickListener {

Intent intent = new Intent();

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.previous_music: // 上一首

playBtn.setBackgroundResource(R.drawable.play_selector);

isFirstTime = false;

isPlaying = true;

isPause = false;

previous();

break;

case R.id.repeat_music: // 重复播放

if (repeatState == isNoneRepeat) {

repeat_one();

shuffleBtn.setClickable(false);

repeatState = isCurrentRepeat;

} else if (repeatState == isCurrentRepeat) {

repeat_all();

shuffleBtn.setClickable(false);

repeatState = isAllRepeat;

} else if (repeatState == isAllRepeat) {

repeat_none();

shuffleBtn.setClickable(true);

repeatState = isNoneRepeat;

}

switch (repeatState) {

case isCurrentRepeat: // 单曲循环

repeatBtn

.setBackgroundResource(R.drawable.repeat_current_selector);

Toast.makeText(HomeActivity.this, R.string.repeat_current,

Toast.LENGTH_SHORT).show();

break;

case isAllRepeat: // 全部循环

repeatBtn

.setBackgroundResource(R.drawable.repeat_all_selector);

Toast.makeText(HomeActivity.this, R.string.repeat_all,

Toast.LENGTH_SHORT).show();

break;

case isNoneRepeat: // 无重复

repeatBtn

.setBackgroundResource(R.drawable.repeat_none_selector);

Toast.makeText(HomeActivity.this, R.string.repeat_none,

Toast.LENGTH_SHORT).show();

break;

}

break;

case R.id.play_music: // 播放音乐

if(isFirstTime) {

play();

isFirstTime = false;

isPlaying = true;

isPause = false;

} else {

if (isPlaying) {

playBtn.setBackgroundResource(R.drawable.pause_selector);

intent.setAction(“com.wwj.media.MUSIC_SERVICE”);

intent.putExtra(“MSG”, AppConstant.PlayerMsg.PAUSE_MSG);

startService(intent);

isPlaying = false;

isPause = true;

} else if (isPause) {

playBtn.setBackgroundResource(R.drawable.play_selector);

intent.setAction(“com.wwj.media.MUSIC_SERVICE”);

intent.putExtra(“MSG”, AppConstant.PlayerMsg.CONTINUE_MSG);

startService(intent);

isPause = false;

isPlaying = true;

}

}

break;

case R.id.shuffle_music: // 随机播放

if (isNoneShuffle) {

shuffleBtn

.setBackgroundResource(R.drawable.shuffle_selector);

Toast.makeText(HomeActivity.this, R.string.shuffle,

Toast.LENGTH_SHORT).show();

isNoneShuffle = false;

isShuffle = true;

shuffleMusic();

repeatBtn.setClickable(false);

} else if (isShuffle) {

shuffleBtn

.setBackgroundResource(R.drawable.shuffle_none_selector);

Toast.makeText(HomeActivity.this, R.string.shuffle_none,

Toast.LENGTH_SHORT).show();

isShuffle = false;

isNoneShuffle = true;

repeatBtn.setClickable(true);

}

break;

case R.id.next_music: // 下一首

playBtn.setBackgroundResource(R.drawable.play_selector);

isFirstTime = false;

isPlaying = true;

isPause = false;

next();

break;

case R.id.playing: //正在播放

Mp3Info mp3Info = mp3Infos.get(listPosition);

Intent intent = new Intent(HomeActivity.this, PlayerActivity.class);

intent.putExtra(“title”, mp3Info.getTitle());

intent.putExtra(“url”, mp3Info.getUrl());

intent.putExtra(“artist”, mp3Info.getArtist());

intent.putExtra(“listPosition”, listPosition);

intent.putExtra(“currentTime”, currentTime);

intent.putExtra(“duration”, duration);

intent.putExtra(“MSG”, AppConstant.PlayerMsg.PLAYING_MSG);

startActivity(intent);

break;

}

}

}

private class MusicListItemClickListener implements OnItemClickListener {

/**

  • 点击列表播放音乐

*/

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

listPosition = position;

playMusic(listPosition);

}

}

public class MusicListItemContextMenuListener implements OnCreateContextMenuListener {

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

Vibrator vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);

vibrator.vibrate(50); //长按振动

musicListItemDialog(); //长按后弹出的对话框

}

}

/**

  • 填充列表

  • @param mp3Infos

*/

public void setListAdpter(List<HashMap<String, String>> mp3list) {

mAdapter = new SimpleAdapter(this, mp3list,

R.layout.music_list_item_layout, new String[] { “title”,

“Artist”, “duration” }, new int[] { R.id.music_title,

R.id.music_Artist, R.id.music_duration });

mMusiclist.setAdapter(mAdapter);

}

/**

  • 下一首歌曲

*/

public void next() {

listPosition = listPosition + 1;

if(listPosition <= mp3Infos.size() - 1) {

Mp3Info mp3Info = mp3Infos.get(listPosition);

musicTitle.setText(mp3Info.getTitle());

Intent intent = new Intent();

intent.setAction(“com.wwj.media.MUSIC_SERVICE”);

intent.putExtra(“listPosition”, listPosition);

intent.putExtra(“url”, mp3Info.getUrl());

intent.putExtra(“MSG”, AppConstant.PlayerMsg.NEXT_MSG);

startService(intent);

} else {

Toast.makeText(HomeActivity.this, “没有下一首了”, Toast.LENGTH_SHORT).show();

}

}

/**

  • 上一首歌曲

*/

public void previous() {

listPosition = listPosition - 1;

if(listPosition >= 0) {

Mp3Info mp3Info = mp3Infos.get(listPosition);

musicTitle.setText(mp3Info.getTitle());

Intent intent = new Intent();

intent.setAction(“com.wwj.media.MUSIC_SERVICE”);

intent.putExtra(“listPosition”, listPosition);

intent.putExtra(“url”, mp3Info.getUrl());

intent.putExtra(“MSG”, AppConstant.PlayerMsg.PRIVIOUS_MSG);

startService(intent);

}else {

Toast.makeText(HomeActivity.this, “没有上一首了”, Toast.LENGTH_SHORT).show();

}

}

public void play() {

playBtn.setBackgroundResource(R.drawable.play_selector);

Mp3Info mp3Info = mp3Infos.get(listPosition);

musicTitle.setText(mp3Info.getTitle());

Intent intent = new Intent();

intent.setAction(“com.wwj.media.MUSIC_SERVICE”);

intent.putExtra(“listPosition”, 0);

intent.putExtra(“url”, mp3Info.getUrl());

intent.putExtra(“MSG”, AppConstant.PlayerMsg.PLAY_MSG);

startService(intent);

}

/**

  • 单曲循环

*/

public void repeat_one() {

Intent intent = new Intent(CTL_ACTION);

intent.putExtra(“control”, 1);

sendBroadcast(intent);

}

/**

  • 全部循环

*/

public void repeat_all() {

Intent intent = new Intent(CTL_ACTION);

intent.putExtra(“control”, 2);

sendBroadcast(intent);

}

/**

  • 顺序播放

*/

public void repeat_none() {

Intent intent = new Intent(CTL_ACTION);

intent.putExtra(“control”, 3);

sendBroadcast(intent);

}

/**

  • 随机播放

*/

public void shuffleMusic() {

Intent intent = new Intent(CTL_ACTION);

intent.putExtra(“control”, 4);

sendBroadcast(intent);

}

public void musicListItemDialog() {

String[] menuItems = new String[]{“播放音乐”,“设为铃声”,“查看详情”};

ListView menuList = new ListView(HomeActivity.this);

menuList.setCacheColorHint(Color.TRANSPARENT);

menuList.setDividerHeight(1);

menuList.setAdapter(new ArrayAdapter(HomeActivity.this, R.layout.context_dialog_layout, R.id.dialogText, menuItems));

menuList.setLayoutParams(new LayoutParams(ConstantUtil.getScreen(HomeActivity.this)[0] / 2, LayoutParams.WRAP_CONTENT));

final CustomDialog customDialog = new CustomDialog.Builder(HomeActivity.this).setTitle(R.string.operation).setView(menuList).create();

customDialog.show();

menuList.setOnItemClickListener( new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

customDialog.cancel();

customDialog.dismiss();

}

});

}

public void playMusic(int listPosition) {

if (mp3Infos != null) {

Mp3Info mp3Info = mp3Infos.get(listPosition);

musicTitle.setText(mp3Info.getTitle());

Intent intent = new Intent(HomeActivity.this, PlayerActivity.class);

intent.putExtra(“title”, mp3Info.getTitle());

intent.putExtra(“url”, mp3Info.getUrl());

intent.putExtra(“artist”, mp3Info.getArtist());

intent.putExtra(“listPosition”, listPosition);

intent.putExtra(“currentTime”, currentTime);

intent.putExtra(“repeatState”, repeatState);

intent.putExtra(“shuffleState”, isShuffle);

intent.putExtra(“MSG”, AppConstant.PlayerMsg.PLAY_MSG);

startActivity(intent);

}

}

@Override

protected void onStop() {

// TODO Auto-generated method stub

super.onStop();

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

}

/**

  • 按返回键弹出对话框确定退出

*/

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK

&& event.getAction() == KeyEvent.ACTION_DOWN) {

new AlertDialog.Builder(this)

.setIcon(R.drawable.ic_launcher)

.setTitle(“退出”)

.setMessage(“您确定要退出?”)

.setNegativeButton(“取消”, null)

.setPositiveButton(“确定”,

new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

finish();

Intent intent = new Intent(

HomeActivity.this,

PlayerService.class);

unregisterReceiver(homeReceiver);

stopService(intent); // 停止后台服务

}

}).show();

}

return super.onKeyDown(keyCode, event);

}

//自定义的BroadcastReceiver,负责监听从Service传回来的广播

public class HomeReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if(action.equals(MUSIC_CURRENT)){

//currentTime代表当前播放的时间

currentTime = intent.getIntExtra(“currentTime”, -1);

musicDuration.setText(MediaUtil.formatTime(currentTime));

} else if (action.equals(MUSIC_DURATION)) {

duration = intent.getIntExtra(“duration”, -1);

}

else if(action.equals(UPDATE_ACTION)) {

//获取Intent中的current消息,current代表当前正在播放的歌曲

listPosition = intent.getIntExtra(“current”, -1);

if(listPosition >= 0) {

musicTitle.setText(mp3Infos.get(listPosition).getTitle());

}

}else if(action.equals(REPEAT_ACTION)) {

repeatState = intent.getIntExtra(“repeatState”, -1);

switch (repeatState) {

case isCurrentRepeat: // 单曲循环

repeatBtn

.setBackgroundResource(R.drawable.repeat_current_selector);

shuffleBtn.setClickable(false);

break;

case isAllRepeat: // 全部循环

repeatBtn

.setBackgroundResource(R.drawable.repeat_all_selector);

shuffleBtn.setClickable(false);

break;

case isNoneRepeat: // 无重复

repeatBtn

.setBackgroundResource(R.drawable.repeat_none_selector);

shuffleBtn.setClickable(true);

break;

}

}

else if(action.equals(SHUFFLE_ACTION)) {

isShuffle = intent.getBooleanExtra(“shuffleState”, false);

if(isShuffle) {

isNoneShuffle = false;

shuffleBtn.setBackgroundResource(R.drawable.shuffle_selector);

repeatBtn.setClickable(false);

} else {

isNoneShuffle = true;

shuffleBtn.setBackgroundResource(R.drawable.shuffle_none_selector);

repeatBtn.setClickable(true);

}

}

}

}

}

到这里,要开讲啦。

以下是需要注意的几点:

1. 音乐是通过Service来播放的,Activity通过启动服务来实现在后台播放音乐。

2. Activity中自定义了一个广播接收器,需要进行intent过滤器的定义,动作的添加,注册广播接收器:

homeReceiver = new HomeReceiver();

// 创建IntentFilter

IntentFilter filter = new IntentFilter();

// 指定BroadcastReceiver监听的Action

filter.addAction(UPDATE_ACTION);

filter.addAction(MUSIC_CURRENT);

filter.addAction(MUSIC_DURATION);

filter.addAction(REPEAT_ACTION);

filter.addAction(SHUFFLE_ACTION);

// 注册BroadcastReceiver

registerReceiver(homeReceiver, filter);

3. 在广播接收器类当中对动作进行处理,比如实现时间的更新和标题的更新等。

4. 这里还要注意按钮触发,播放状态的改变,比如音乐循环,有三种状态:单曲、全部循环、顺序,每切换一个状态都要向服务发送一条广播,通知它要改变状态。

5. 点击列表的时候,会跳入到播放界面的Activity中,要注意用intent来传递参数,注意每个参数的用途,比如title、url、MSG,就分别代表标题、路径、播放状态。

6. 长按列表会弹出自定义对话框,也会有短暂的震动效果,自定义对话框需要自行实现。这里我也贴一下实现代码吧。

package com.wwj.sb.utils;

import android.app.Activity;

import android.app.Dialog;

import android.content.Context;

import android.content.DialogInterface;

import android.text.TextUtils;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.view.ViewGroup.LayoutParams;

import android.widget.Button;

import android.widget.FrameLayout;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.TextView;

import com.wwj.sb.activity.R;

/**

  • 自定义对话框类

  • @author wwj

*/

public class CustomDialog extends Dialog {

public CustomDialog(Context context) {

super(context);

}

public CustomDialog(Context context, int theme) {

super(context, theme);

}

public static class Builder {

private Context context;

private int mIcon = -1; // 提示图标

private CharSequence mTitle; // 提示标题

private CharSequence mMessage; // 提示内容

private CharSequence mPositiveButtonText; // 确定按钮文本

private CharSequence mNegativeButtonText; // 取消按钮文本

private CharSequence mNeutralButtonText; // 中间按钮文本

private boolean mCancelable = true; // 是否启用取消键

private int mViewSpacingLeft;

private int mViewSpacingTop;

private int mViewSpacingRight;

private int mViewSpacingBottom;

private boolean mViewSpacingSpecified = false;

// 提示内容View

private View mView;

// 各种触发事件

private OnClickListener mPositiveButtonClickListener,

mNegativeButtonClickListener, mNeutralButtonClickListener;

private OnCancelListener mCancelListener; // 取消键事件

private OnKeyListener mKeyListener; // 按键处理

public Builder(Context context) {

this.context = context;

}

public Builder setMessage(CharSequence message) {

this.mMessage = message;

return this;

}

public Builder setMessage(int message) {

this.mMessage = context.getText(message);

return this;

}

public Builder setTitle(int title) {

this.mTitle = context.getText(title);

return this;

}

public Builder setTitle(CharSequence title) {

this.mTitle = title;

return this;

}

public Builder setIcon(int icon) {

this.mIcon = icon;

return this;

}

public Builder setView(View view) {

this.mView = view;

mViewSpacingSpecified = false;

return this;

}

public Builder setView(View view, int left, int top, int right,

int bottom) {

this.mView = view;

this.mViewSpacingLeft = left;

this.mViewSpacingTop = top;

this.mViewSpacingRight = right;

this.mViewSpacingBottom = bottom;

mViewSpacingSpecified = true;

return this;

}

public Builder setPositonButton(int textId,

final OnClickListener listener) {

this.mPositiveButtonText = context.getText(textId);

this.mPositiveButtonClickListener = listener;

return this;

}

public Builder setPostionButton(String text,

final OnClickListener listener) {

this.mPositiveButtonText = text;

this.mPositiveButtonClickListener = listener;

return this;

}

public Builder setNeutralButton(int textId,

final OnClickListener listener) {

this.mNeutralButtonText = context.getText(textId);

this.mNeutralButtonClickListener = listener;

return this;

}

public Builder setNeutralButton(String text, final OnClickListener listener) {

this.mNeutralButtonText = text;

this.mNeutralButtonClickListener = listener;

return this;

}

public Builder setNegativeButton(int textId,

final OnClickListener listener) {

this.mNegativeButtonText = context.getText(textId);

this.mNegativeButtonClickListener = listener;

return this;

}

public Builder setNegativeButton(String text,

final OnClickListener listener) {

this.mNegativeButtonText = text;

this.mNegativeButtonClickListener = listener;

return this;

}

public Builder setCancelable(boolean cancelable) {

this.mCancelable = cancelable;

return this;

}

public Builder setOnCancelListener(OnCancelListener listener) {

this.mCancelListener = listener;

return this;

}

public Builder setOnKeyListener(OnKeyListener listener) {

this.mKeyListener = listener;

return this;

}

public CustomDialog create() {

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

final CustomDialog dialog = new CustomDialog(context, R.style.CustomDialog);

dialog.setCancelable(mCancelable);

//设置取消键事件

if(mCancelListener != null) {

dialog.setOnCancelListener(mCancelListener);

}

//设置键盘监听事件

if(mKeyListener != null) {

dialog.setOnKeyListener(mKeyListener);

}

//获取对话框布局

View layout = inflater.inflate(R.layout.alert_dialog, (ViewGroup)(((Activity)context).findViewById(R.id.parentPanel)));

layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

//设置标题

((TextView) layout.findViewById(R.id.alertTitle)).setText(mTitle);

//设置图标

if(mIcon != -1) {

((ImageView) layout.findViewById(R.id.icon))

.setBackgroundResource(mIcon);

}

int count = 0;

//设置确定按钮

if(setButton(layout, mPositiveButtonText, R.id.button1, dialog, mPositiveButtonClickListener)) count++;

// 设置拒绝按钮

if(setButton(layout, mNegativeButtonText, R.id.button2, dialog, mNegativeButtonClickListener)) count++;

// 设置中间按钮

if(setButton(layout, mNeutralButtonText, R.id.button3, dialog, mNeutralButtonClickListener)) count++;

if(count == 0) {

layout.findViewById(R.id.buttonPanel).setVisibility(View.GONE);

}

//一个按钮时,显示两边空间

if(count == 1) {

layout.findViewById(R.id.leftSpacer)

.setVisibility(View.INVISIBLE);

layout.findViewById(R.id.rightSpacer).setVisibility(View.INVISIBLE);

}

//设置提示消息

if(!TextUtils.isEmpty(mMessage)) {

((TextView)layout.findViewById(R.id.message))

.setText(mMessage);

} else {

((LinearLayout) layout.findViewById(R.id.contentPanel))

.setVisibility(View.GONE);

}

//设置提示内容布局

if(mView != null) {

final FrameLayout customPanel = (FrameLayout) layout

.findViewById(R.id.customPanel);

if(mViewSpacingSpecified) {

customPanel.setPadding(mViewSpacingLeft, mViewSpacingTop, mViewSpacingRight, mViewSpacingBottom);

}

customPanel.addView(mView);

} else {

((FrameLayout) layout.findViewById(R.id.customPanel))

.setVisibility(View.GONE);

}

dialog.setContentView(layout);

return dialog;

}

public CustomDialog show() {

CustomDialog dialog = create();

dialog.show();

return dialog;

}

private boolean setButton(View layout, CharSequence mPositiveButtonText, int id, final Dialog dialog, final OnClickListener listener) {

if(!TextUtils.isEmpty(mPositiveButtonText)) {

final Button button = (Button) layout.findViewById(id);

button.setText(mPositiveButtonText);

if(listener != null) {

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

listener.onClick(dialog, DialogInterface.BUTTON_POSITIVE);

}

});

} else {

//默认事件为关闭对话框

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

题外话

我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-KxLqlqQw-1712830471540)]
[外链图片转存中…(img-HCCbiT16-1712830471540)]
[外链图片转存中…(img-jAysLEnT-1712830471540)]
[外链图片转存中…(img-AbL5XS0K-1712830471541)]
[外链图片转存中…(img-o4UAq4Xt-1712830471541)]
[外链图片转存中…(img-hc2RnSsn-1712830471541)]
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-56NPHmZq-1712830471542)]

题外话

我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-6RlAjYK1-1712830471542)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-90rUAMI3-1712830471542)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值