Android最全Android学习笔记-Android初级 (一),音视频学习指南来咯

最后

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 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>
  1. 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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值