/**
- 给每一个按钮设置监听器
*/
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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
题外话
我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。
其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。
不断奔跑,你就知道学习的意义所在!
注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-KxLqlqQw-1712830471540)]
[外链图片转存中…(img-HCCbiT16-1712830471540)]
[外链图片转存中…(img-jAysLEnT-1712830471540)]
[外链图片转存中…(img-AbL5XS0K-1712830471541)]
[外链图片转存中…(img-o4UAq4Xt-1712830471541)]
[外链图片转存中…(img-hc2RnSsn-1712830471541)]
既有适合小白学习的零基础资料,也有适合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)]