最后
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="one"
android:onClick="one"
android:id="@+id/button2"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="two"
android:onClick="two"
android:id="@+id/button3"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<FrameLayout
android:id="@+id/ft_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_below="@+id/button2"></FrameLayout>
package com.recycler.zx.zxrecyclerview.fragments;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.recycler.zx.zxrecyclerview.R;
/**
- A simple {@link Fragment} subclass.
*/
public class PopBacksFragment extends Fragment {
private static final String TITLE = “title”;
private String title ;
public PopBacksFragment(){}
// public PopBacksFragment(String title) {
// this.title =title;
// }
//fragment的标准传参数方法,这样传参数的时候屏幕旋转数据不会消失,(并且Fragment是不允许使用有参的构造方法的)
public static PopBacksFragment getInstance(String title){
PopBacksFragment pf = new PopBacksFragment();
Bundle bundle = new Bundle();
bundle.putString(TITLE,title);
pf.setArguments(bundle);
return pf;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_pop_backs, container, false);
TextView tvPop = (TextView) v.findViewById(R.id.tv_pop);
tvPop.setText(getArguments().getString(TITLE));
return v;
}
}
8.fragment和activity交换数据
//把数据从MenuFragment 传递到 MainFragment
package com.recycler.zx.zxrecyclerview.fragments.fragmentAndActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.recycler.zx.zxrecyclerview.R;
public class FramentAndActivity extends AppCompatActivity implements MenuFragment.MyMenuListener {
private MenuFragment menuFragment;
private MainFragment mainFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frament_and);
menuFragment = (MenuFragment) getFragmentManager().findFragmentById(R.id.menu_fragment);
mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.main_frament);
}
@Override
public void changeValue(String value) {
mainFragment.setTvValue(value);
}
}
package com.recycler.zx.zxrecyclerview.fragments.fragmentAndActivity;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import com.recycler.zx.zxrecyclerview.R;
/**
- A simple {@link Fragment} subclass.
*/
public class MenuFragment extends Fragment {
private MyMenuListener mMyMenuListener;
public MenuFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Activity context) {
super.onAttach(context);
mMyMenuListener = (MyMenuListener) context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_menu, container, false);
Button news = (Button) v.findViewById(R.id.news);
Button music = (Button) v.findViewById(R.id.music);
news.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMyMenuListener.changeValue("news");
}
});
music.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMyMenuListener.changeValue("music");
}
});
return v;
}
//定义一个回调接口,要求宿主(包含它的Activity)去实现它
public static interface MyMenuListener{
public void changeValue(String value);
}
}
package com.recycler.zx.zxrecyclerview.fragments.fragmentAndActivity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.recycler.zx.zxrecyclerview.R;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
- A simple {@link Fragment} subclass.
*/
public class MainFragment extends Fragment {
@Bind(R.id.tv_value)
TextView tvValue;
public MainFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_main, container, false);
ButterKnife.bind(this, view);
return view;
}
public void setTvValue(String value){
tvValue.setText(value);
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
}
8.PreferenceFragment 实现设置用户习惯操作
> 1.res根目录新建一个xml文件夹和xml文件
> ![这里写图片描述](https://img-blog.csdn.net/20160202141711647)
<?xml version="1.0" encoding="utf-8"?>
<PreferenceCategory
android:title="声音设置">
<CheckBoxPreference
android:key="checkbox_preference"
android:title="是否打开声音"
android:summary="打开声音后可以自动开启音乐" />
</PreferenceCategory>
<PreferenceCategory
android:title="城市">
<EditTextPreference
android:key="edittext_preference"
android:title="昵称"
android:summary="请输入昵称:"
android:dialogTitle="昵称哇:" />
<ListPreference
android:key="list_preference"
android:title="城市名称"
android:summary="请选择城市"
android:entries="@array/city"
android:entryValues="@array/city"
android:dialogTitle="城市名称哇:" />
<PreferenceScreen
android:title="百度"
android:summary="访问">
<intent android:action="android.intent.action.VIEW"
android:data="http://www.android.com" />
</PreferenceScreen>
</PreferenceCategory>
2.String.xml中可能需要使用
<item>北京</item>
<item>上海</item>
<item>关注</item>
<item>杭州</item>
</string-array>
- PrefsFragmentextends PreferenceFragment
package com.recycler.zx.zxrecyclerview.fragments.preference;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import com.recycler.zx.zxrecyclerview.R;
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.my_preference);
}
}
9.ActionBar
package com.recycler.zx.zxrecyclerview.ActionBar;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.ShareActionProvider;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.MenuActivity;
import com.recycler.zx.zxrecyclerview.R;
import com.recycler.zx.zxrecyclerview.TimeActivity;
import com.recycler.zx.zxrecyclerview.fragments.ContentFragment;
import com.recycler.zx.zxrecyclerview.fragments.TitleFragment;
public class MyActionBarActivity extends AppCompatActivity implements ActionBar.TabListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_action_bar);
ActionBar actionBar = getSupportActionBar();
// actionBar.hide();//隐藏actionbar
actionBar.setHomeButtonEnabled(true);
startActivity(new Intent(this, MenuActivity.class));
//导航条
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);//标题栏不显示
//添加选项卡
ActionBar.Tab tab = actionBar.newTab()
.setText("美女")
.setTabListener(this);
actionBar.addTab(tab);
tab = actionBar.newTab()
.setText("新闻")
.setTabListener(this);
actionBar.addTab(tab);
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getCallState();
telephonyManager.listen(new PhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE );
}
@Override
public boolean onCreateOptionsMenu( Menu menu) {
getMenuInflater().inflate(R.menu.menu_context, menu);
//搜索
MenuItem mi = menu.findItem(R.id.yellow);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(mi);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(MyActionBarActivity.this,"---"+query,Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
//分享
MenuItem mi2 = menu.findItem(R.id.share);
ShareActionProvider provier = (ShareActionProvider)MenuItemCompat.getActionProvider(mi2);
provier.setShareIntent(getDefaultIntent2());
return true;
}
private Intent getDefaultIntent(){
Intent in = new Intent(Intent.ACTION_SEND);
in.setType("image/*");
return in;
}
private Intent getDefaultIntent2(){
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"这是。。");
startActivity(intent);
return intent;
}
//导航条
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
Toast.makeText(this,tab.getText(),Toast.LENGTH_SHORT).show();
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
//电话服务
class PhoneStateListener extends android.telephony.PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING :
Toast.makeText(MyActionBarActivity.this,"正在响铃",Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_IDLE :
Toast.makeText(MyActionBarActivity.this,"正在响铃",Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK :
Toast.makeText(MyActionBarActivity.this,"正在响铃",Toast.LENGTH_SHORT).show();
break;
}
}
}
}
public class MenuActivity extends AppCompatActivity {
@Bind(R.id.tv_bg)
TextView mTvBg;
@Bind(R.id.tv_popmenu)
TextView mTvPopmenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
ButterKnife.bind(this);
ActionBar actionBar = getSupportActionBar();
// actionBar.hide();//隐藏actionbar
actionBar.setDisplayHomeAsUpEnabled(true);//设置当前的activity
10.handler实现原理与机制
![这里写图片描述](https://img-blog.csdn.net/20160202142052746)
> 1.handler发送一个消息(Message)到消息队列(MessageQueue)
> 2.Looper检查消息队列(MessageQueue先进先出)中是否有消息
> 3.如果检测到MessageQueue有消息就发送消息(1.obtainMessage2.msg.obj = “1”3.sendMessage)到HandlerMessage把消息传递回去
>
> Message msg = new Message();
> Message msg = obtainMessage();//使用消息池,消息对象复用,不用每次都new(消息对象池的机制:链表结构)
>
> //handler机制:
> 1.Message 消息对象,内部使用链表数据结构实现一个消息池,用于复用,避免大量创建消息对象,造成内存浪费
> 2.Handler 消息处理者,通过该对象把消息存入消息队列,并通过handlerMessage方法处理消息
> 3.MessageQueue消息队列,用于存储Message对象的数据结构,先进先出
> 4.Looper消息队列的处理者,用于循环检测消息队列(MessageQueue),从消息队列中一个一个的取出消息对象,传入HandlerMessage方法中
11.Handler内存泄露分析
package com.recycler.zx.zxrecyclerview.Handler;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.R;
import java.lang.ref.WeakReference;
//Handler的内存泄露问题
//1.定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义一个静态(static)内部类(因为静态内部类就相当于一个外部类,不拥有外部类的引用)
//2.引用的强弱:强引用(new 出来的对象,就是强引用,就算内存不足也不会被自动回收,想要回收必须把对象置空或销毁当前对象,回收器才会回收)
// ->软引用(A引用B,当B内存不足的时候,系统就会回收它)
// ->弱引用(引用的对象如果不存在就得不到)
//3.
public class MemoryOverflowActivity extends AppCompatActivity {
private String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_overflow);
//这样写会出现内存泄露
/*1.当Handler作为内部类使用的时候,那么handler持有外部类的引用;
如果外部类退出的时候,handler还在运行的话,外部类(Activity)就退出不了,就算退出了,还还在占用着内存。那么就造成了内存溢出(泄露)
(Handler依赖于外部类)*/
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
}
},60*10*1000);//延迟10分钟执行run方法
Toast.makeText(this,"来过",Toast.LENGTH_SHORT).show();
finish();
}
private MyHandler handler = new MyHandler(this);
//这个是标准的Handler写法,1.static内部类(相当于外部类,不依赖外部类)2.弱引用(防止内存泄露)3.通过mWeakReference.get()返回一个Activity
private static class MyHandler extends Handler{
//软引用Activity
WeakReference<MemoryOverflowActivity> mWeakReference;
public MyHandler(MemoryOverflowActivity activity){
mWeakReference = new WeakReference<MemoryOverflowActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果MemoryOverflowActivity被销毁了,那么mWeakReference.get()返回的就是null
//如果返回null你就不能 name 变量(因为name属于MemoryOverflowActivity的变量,MemoryOverflowActivity为null,它的变量自然就不能使用)
//使用弱引用,就可以避免内存泄露(溢出)
MemoryOverflowActivity activity = mWeakReference.get();
if(activity != null) {
}
}
}
}
SplashAcitivity的Style
<activity android:name=“.FirstActivity” android:theme="@android:style/Theme.DeviceDefault.Light.NoA
12.执行耗时操作的第二种方式(AsyncTask),第一种是Thread
package com.recycler.zx.zxrecyclerview.Handler;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.R;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import butterknife.Bind;
import butterknife.ButterKnife;
//Handler的内存泄露问题
//1.定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义一个静态(static)内部类(因为静态内部类就相当于一个外部类,不拥有外部类的引用)
//2.引用的强弱:强引用(new 出来的对象,就是强引用,就算内存不足也不会被自动回收,想要回收必须把对象置空或销毁当前对象,回收器才会回收)
// ->软引用(A引用B,当B内存不足的时候,系统就会回收它)
// ->弱引用(引用的对象如果不存在就得不到)
//3.
public class MemoryOverflowActivity extends AppCompatActivity {
@Bind(R.id.textView2)
TextView textView2;
@Bind(R.id.progressBar2)
ProgressBar progressBar2;
private String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_overflow);
ButterKnife.bind(this);
//这样写会出现内存泄露
/*1.当Handler作为内部类使用的时候,那么handler持有外部类的引用;
如果外部类退出的时候,handler还在运行的话,外部类(Activity)就退出不了,就算退出了,还还在占用着内存。那么就造成了内存溢出(泄露)
(Handler依赖于外部类)*/
/*new Handler().postDelayed(new Runnable() {
@Override
public void run() {
}
}, 60 * 10 * 1000);//延迟10分钟执行run方法
Toast.makeText(this, "来过", Toast.LENGTH_SHORT).show();
finish();*/
}
private MyHandler handler = new MyHandler(this);
//这个是标准的Handler写法,1.static内部类(相当于外部类,不依赖外部类)2.软引用(防止内存泄露)3.通过mWeakReference.get()返回一个Activity
private static class MyHandler extends Handler {
//软引用Activity
WeakReference<MemoryOverflowActivity> mWeakReference;
public MyHandler(MemoryOverflowActivity activity) {
mWeakReference = new WeakReference<MemoryOverflowActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果MemoryOverflowActivity被销毁了,那么mWeakReference.get()返回的就是null
//如果返回null你就不能 name 变量(因为name属于MemoryOverflowActivity的变量,MemoryOverflowActivity为null,它的变量自然就不能使用)
//使用软引用,就可以避免内存泄露(溢出)
MemoryOverflowActivity activity = mWeakReference.get();
if (activity != null) {
}
}
}
//通过AsyncTask实现一个异步任务
private static class DownLoadAsynTask extends AsyncTask<String, Integer, String> {
private MemoryOverflowActivity mActivity;//这样写是有问题的,你既然使用了弱引用,就不能申明成员变量
在下面的每个方法中,只要你用到了你就必须通过mWeakReference.get();方法获取,不能直接申明一个成员变量接收
public DownLoadAsynTask(MemoryOverflowActivity activity) {
WeakReference<MemoryOverflowActivity> mWeakReference = new WeakReference<MemoryOverflowActivity>(activity);
mActivity = mWeakReference.get();
}
//执行任务之前触发,可以做一些初始化工作,主线程调用的
@Override
protected void onPreExecute() {
super.onPreExecute();
mActivity.textView2.setText("开始执行下载任务");
mActivity.progressBar2.setProgress(0);
}
//执行后台任务的方法,类似于线程,所以不能在该方法中访问Ui组件
@Override
protected String doInBackground(String... params) {
String imgurl = params[0];
try {
URL url = new URL(imgurl);
//打开连接
HttpURLConnection con = (HttpURLConnection) url.openConnection();
int size = con.getContentLength();
//0:表示需要更新最大进度值1:表示更新当前进度值
publishProgress(0,size);
InputStream in = con.getInputStream();
byte[] bytes = new byte[20];
int len = -1;
while((len = in.read(bytes)) != -1) {
//out.write(bytes,0,size);
publishProgress(1,len);//更新当前进度
//out.flush();
}
//out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
return "error";
}
return "success";
}
//更新进度值
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
switch (values[0]){
case 0:
mActivity.progressBar2.setMax(values[1]);
break;
case 1:
mActivity.progressBar2.incrementProgressBy(values[1]);
break;
}
}
//当doInBackground被调用返回的时候调用
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if(s.equals("success")) {
mActivity.textView2.setText("下载完成");
}else {
Toast.makeText(mActivity,"失败",Toast.LENGTH_SHORT).show();
}
}
}
public void download(View v) {
DownLoadAsynTask task = new DownLoadAsynTask(this);
task.execute("http://p2.so.qhimg.com/t01e767afd2dbff19ac.jpg");
}
}
<?xml version="1.0" encoding="utf-8"?><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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.recycler.zx.zxrecyclerview.Handler.MemoryOverflowActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/textView2"
android:onClick="download"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/progressBar2"
android:layout_below="@+id/textView2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
13.文件管理
package com.recycler.zx.zxrecyclerview.FileReadWriter;
import android.content.Context;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.R;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
public class FileActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
try {
//存储私有文件
savePrivateFile();
//读取私有文件
readPrivateFile();
//读取res/raw
readRawFile();
//读取缓存文件
readCacheFile();
更多Android高级工程师进阶学习资料
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
13.文件管理
package com.recycler.zx.zxrecyclerview.FileReadWriter;
import android.content.Context;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.R;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
public class FileActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
try {
//存储私有文件
savePrivateFile();
//读取私有文件
readPrivateFile();
//读取res/raw
readRawFile();
//读取缓存文件
readCacheFile();
更多Android高级工程师进阶学习资料
进阶学习视频
[外链图片转存中…(img-arfLR3Lm-1715187589712)]
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-CVDiIqta-1715187589712)]
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!