Android中一些基本功能的实现

来源:互联网 发布:网络暴力电影 编辑:程序博客网 时间:2024/06/02 00:21

好记性不如烂笔头,这个周末又把自己给荒废了,周六搬家,接女朋友过来,周末去海边玩了,连续两天没写代码,好像欠自己点什么似的,慌得不行!不多说废话了,还是来一片小博客压压惊!


基础控件

TextView

     <TextView                    android:textSize="15sp"                    android:textScaleX="1.1"            //字间距                    android:lineSpacingExtra="3dp"      //行间距                    android:lineSpacingMultiplier="1.2" //行间距倍数                    android:textColor="@color/white"                    android:text="@string/message_mask"                    android:layout_marginTop="17dp"                    android:layout_gravity="center"                    android:layout_width="250dp"                    android:layout_height="wrap_content"/>

弹窗

View rootView = getLayoutInflater().inflate(R.layout.popupwindow_more, null);        PopupWindow popupWindow = new PopupWindow(rootView.getRootView(), ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        popupWindow.setOutsideTouchable(true);popupWindow.showAtLocation(rootView.getRootView(),Gravity.BOTTOM,0,0);

DialogFragment

刚开始看到这个需求本来是想使用布局的现实隐藏的,让后自定义一个动画,后来问了下朋友,说有一个DialogFragment的组件可以实现,还不错,简单测试效果图如下 :

网上别人实现的效果
项目代码参考github:BottomDialogFragmentDemo;

自己实现的效果
代码如下:
按钮点击部分操作如下代码:

private void showPopupWindow() {        Log.d(TAG, "showPopupWindow() called");        BottomDialogFragment dialogFragment = new BottomDialogFragment();        dialogFragment.show(getFragmentManager(), "");    }

设置一个BottomDialogFragment类继承DialogFragment;
代码:

public class BottomDialogFragment extends DialogFragment {    @Override    public Dialog onCreateDialog(Bundle savedInstanceState) {    mDialog = new Dialog(getActivity(), R.style.BottomDialog);        mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置Content前设定        mDialog.setContentView(R.layout.popup_window);        mDialog.setCanceledOnTouchOutside(true); // 外部点击取消        mDialog.getWindow().setWindowAnimations(R.style.bottom_dialog_anim_style);        // 设置宽度为屏宽, 靠近屏幕底部。        Window window = mDialog.getWindow();        WindowManager.LayoutParams lp = window.getAttributes();        lp.gravity = Gravity.BOTTOM; // 紧贴底部        lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 宽度持平        window.setAttributes(lp);        ButterKnife.bind(this, mDialog);        return mDialog;    }}

bottom_dialog_anim_style代码:

 <style name="bottom_dialog_anim_style">        <item name="android:windowEnterAnimation">@anim/popshow_anim</item>        <!-- 指定显示的动画xml -->        <item name="android:windowExitAnimation">@anim/pophidden_anim</item>        <!-- 指定消失的动画xml -->    </style>

popshow_anim显示动画代码:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:duration="1000"        android:fromXDelta="100%p"        android:toXDelta="0" />    <alpha        android:duration="1000"        android:fromAlpha="0.0"        android:toAlpha="1.0" /></set>

pophiden_anim.xml代码:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:duration="1000"        android:fromXDelta="0"        android:toXDelta="50%p" />    <alpha        android:duration="1000"        android:fromAlpha="1.0"        android:toAlpha="0.0" /></set>

基本功能

隐藏键盘

  public void hideSofeKey(){        View view = getWindow().peekDecorView();        if (view != null) {            InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);        }    }

如何对Android中的实体类进行排序:

总有一些千奇百怪的数据让你去处理,不处理又不行,真是**。

public class TestSortCmparator implements Comparator {    @Overridec    public int compare(Object o1, Object o2) {        SeriesBean bean1 = (SeriesBean) o1;        SeriesBean bean2 = (SeriesBean) o2;        return (bean1.getTitle().compareTo(bean2.getTitle()));    }}

在需要排序的地方:

TestSortCmparator cmparator = new TestSortCmparator();Collections.sort(mSeries,cmparator);

Android系统自带分享
这里写图片描述

 /**     * 分享功能     * @param activityTitle     *            Activity的名字     * @param msgTitle     *            消息标题     * @param msgText     *            消息内容     * @param imgPath     *            图片路径,不分享图片则传null     */    public void shareMsg(String activityTitle, String msgTitle, String msgText,                         String imgPath) {        Intent intent = new Intent(Intent.ACTION_SEND);        if (imgPath == null || imgPath.equals("")) {            intent.setType("text/*"); // 纯文本        } else {            File f = new File(imgPath);            if (f != null && f.exists() && f.isFile()) {                intent.setType("image/*");                Uri u = Uri.fromFile(f);                intent.putExtra(Intent.EXTRA_STREAM, u);            }        }        intent.putExtra(Intent.EXTRA_SUBJECT, msgTitle);        intent.putExtra(Intent.EXTRA_TEXT, msgText);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        startActivity(Intent.createChooser(intent, activityTitle));    }

FloatButton的使用

 <android.support.design.widget.FloatingActionButton        app:rippleColor="#56abe4"        app:backgroundTint="#56abe4"        android:id="@+id/fab_add_comment"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="end|bottom"        android:layout_margin="50dp"        app:elevation="6dp"//显示的阴影大小      app:pressedTranslationZ="12dp"//点击时的阴影大小        android:src="@drawable/ic_comment"/>

[FloatingActionButton更详细的说明请看鸿洋大神的博客]
(http://blog.csdn.net/lmj623565791/article/details/46678867)


Android中检查网络和内存空间的方法

开发视频App中,这一点是很有必要的,当用户需要下载某个视频文件的时候,必须先判断系统是否能装下预下载文件的大小,如果不行,则警告用户不能下载,直接取消下载。

/**     * 检查是否有网络     */    public static boolean isNetworkAvailable(Context context)    {        NetworkInfo info = getNetworkInfo(context);        return info != null && info.isAvailable();    }    /**     * 检查是否是WIFI     */    public static boolean isWifi(Context context)    {        NetworkInfo info = getNetworkInfo(context);        if (info != null)        {            if (info.getType() == ConnectivityManager.TYPE_WIFI)                return true;        }        return false;    }    /**     * 检查是否是移动网络     */    public static boolean isMobile(Context context)    {        NetworkInfo info = getNetworkInfo(context);        if (info != null)        {            if (info.getType() == ConnectivityManager.TYPE_MOBILE)                return true;        }        return false;    }    private static NetworkInfo getNetworkInfo(Context context)    {        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        return cm.getActiveNetworkInfo();    }    /**     * 检查SD卡是否存在     */    private static boolean checkSdCard()    {        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);    }    /**     * 获取手机SD卡总空间     *     * @return     */    private static long getSDcardTotalSize()    {        if (checkSdCard())        {            File path = Environment.getExternalStorageDirectory();            StatFs mStatFs = new StatFs(path.getPath());            long blockSizeLong = mStatFs.getBlockSizeLong();            long blockCountLong = mStatFs.getBlockCountLong();            return blockSizeLong * blockCountLong;        } else        {            return 0;        }    }    /**     * 获取SDka可用空间     *     * @return     */    private static long getSDcardAvailableSize()    {        if (checkSdCard())        {            File path = Environment.getExternalStorageDirectory();            StatFs mStatFs = new StatFs(path.getPath());            long blockSizeLong = mStatFs.getBlockSizeLong();            long availableBlocksLong = mStatFs.getAvailableBlocksLong();            return blockSizeLong * availableBlocksLong;        } else            return 0;    }    /**     * 获取手机内部存储总空间     *     * @return     */    public static long getPhoneTotalSize()    {        if (!checkSdCard())        {            File path = Environment.getDataDirectory();            StatFs mStatFs = new StatFs(path.getPath());            long blockSizeLong = mStatFs.getBlockSizeLong();            long blockCountLong = mStatFs.getBlockCountLong();            return blockSizeLong * blockCountLong;        } else            return getSDcardTotalSize();    }    /**     * 获取手机内存存储可用空间     *     * @return     */    public static long getPhoneAvailableSize()    {        if (!checkSdCard())        {            File path = Environment.getDataDirectory();            StatFs mStatFs = new StatFs(path.getPath());            long blockSizeLong = mStatFs.getBlockSizeLong();            long availableBlocksLong = mStatFs.getAvailableBlocksLong();            return blockSizeLong * availableBlocksLong;        } else            return getSDcardAvailableSize();    }

如何用Progress实现可用内存比
这里写图片描述

没错,就是这个黄黄的东西

xml部分代码:

<FrameLayout                android:layout_width="match_parent"                android:layout_height="wrap_content">                <com.home.quhong.quhong.TV.widght.progressbar.NumberProgressBar                    style="@style/NumberProgressBar_Beauty_Red"                    android:id="@+id/down_progress_bar"                    android:layout_width="match_parent"                    android:layout_height="match_parent"                    app:progress_reached_bar_height="35dp"                    app:progress_max="100"                    app:progress_text_visibility="invisible" />                <LinearLayout                    android:id="@+id/down_ll_memory"                    android:background="@color/transparent"                    android:layout_width="match_parent"                    android:layout_height="match_parent"                    android:gravity="bottom"                    android:orientation="horizontal">                    <TextView                        android:id="@+id/down_tv_memory_size"                        android:layout_width="match_parent"                        android:background="@color/transparent"                        android:layout_height="match_parent"                        android:layout_gravity="center"                        android:layout_weight="1"                        android:gravity="center"                        android:text="avalible 4.47GB/Total 4.84GB" />                    </LinearLayout>            </FrameLayout>

style部分代码:

<style name="NumberProgressBar_Beauty_Red">        <item name="progress_max">100</item>        <item name="progress_current">0</item>        <item name="progress_unreached_color">@color/gray_light</item>        <item name="progress_reached_color">@color/colorPrimary</item>        <item name="progress_text_size">10sp</item>        <item name="progress_text_color">#cccc</item>    </style>

activity代码:

private void initMemoryBar() {        long phoneTotalSize = CommonUtil.getPhoneTotalSize();        long phoneAvailableSize = CommonUtil.getPhoneAvailableSize();        //转换为G的显示单位        String totalSizeStr = Formatter.formatFileSize(this, phoneTotalSize);        String availabSizeStr = Formatter.formatFileSize(this, phoneAvailableSize);        int progress = countProgress(phoneTotalSize, phoneAvailableSize);        mDownProgressBar.setProgress(progress);        String s = "Available Size: " + availabSizeStr + "/Total Size: " + totalSizeStr;        mDownTvMemorySize.setText(s);    }private int countProgress(long phoneTotalSize, long phoneAvailableSize) {        double totalSize = phoneTotalSize / (1024 * 3);        double availabSize = phoneAvailableSize / (1024 * 3);        //取整相减        int size = (int) (Math.floor(totalSize) - Math.floor(availabSize));        double v = (size / Math.floor(totalSize)) * 100;        return (int) Math.floor(v);    }

如何自定义ProgressBar

估计没人想使用系统自带的ProgressBar,不要问为什么,因为太丑太难看。

<ProgressBar            android:id="@+id/down_loaded_pb"            style="?android:attr/progressBarStyleHorizontal"            android:layout_width="fill_parent"            android:layout_height="7.5dp"            android:max="100"            android:progress="10"            android:layout_marginRight="8dp"            android:progressDrawable="@drawable/progress_bar_bg"            android:visibility="visible"/>

progress_bar_bg.xml代码

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:id="@android:id/background">        <shape>            <corners android:radius="5dip" />            <gradient                android:angle="0"                android:centerColor="#ff5a5d5a"                android:centerY="0.75"                android:endColor="#ff747674"                android:startColor="#ff9d9e9d" />        </shape>    </item>    <item android:id="@android:id/secondaryProgress">        <clip>            <shape>                <corners android:radius="5dip" />                <gradient                    android:angle="0"                    android:centerColor="#80ffb600"                    android:centerY="0.75"                    android:endColor="#a0ffcb00"                    android:startColor="#80ffd300" />            </shape>        </clip>    </item>    <item android:id="@android:id/progress">        <clip>            <shape>                <corners android:radius="5dip" />                <gradient                    android:angle="0"                    android:endColor="#80f9bc01"                    android:startColor="#80f9bc01" />            </shape>        </clip>    </item></layer-list>

效果图如下:
这里写图片描述


如何用好Okhttp+Gson解析

之前一直使用Retrofit+RxJava请求,不过这个不能满足动态修改整体网络链接,所以写了个简单的okhttp+Gson,代码如下:

注意:
1.实体类对象需要序列化
2.用handler处理获取数据,不然会抛UncaughtExceptionHandler
需要导的包:
compile ‘com.squareup.okhttp3:okhttp:3.2.0’
compile ‘com.google.code.gson:gson:2.8.0’

//网络请求public static void doGetCall(String url, Context context, Callback callback) {        Request request = new Request.Builder()                .url(url)                .get()                .tag(context)                .build();        new OkHttpClient().newCall(request).enqueue(callback);    }    //解析方法,调用即可   public void initUrlAgain(String url) {        doGetCall(url, this, new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                String string = response.body().string();                Gson gson = new Gson();                mRequestSeries = gson.fromJson(string, RequestSeries.class);                Message message = new Message();                message.what = 200;                myHandler.sendMessage(message);            }        });    }    //Handler处理数据     private Handler myHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what){                case 200:                    Toast.makeText(PlayerActivity.this, mRequestSeries.getUrl(), Toast.LENGTH_SHORT).show();                    break;            }        }    };

SQLite的简单使用:

开发Android,SQLite知识是必须的,现在没时间写详细的博客,先记载下,之后会写的!很长一段时间没有更新博客,一是觉得以前写的一些东西的确基础,而且没有详细整理,二是自己写的博客质量并不高,看得人也不多,所以现在先给自己看看!好好记录下就行。

使用SQLite,习惯性的5步:
1. 创建一个MetaData;
2. 创建一个DatabaseHelper继承SQLiteOpenHelper
3. 创建一个实体类,属性为数据库的字段。
4. 创建一个适配器DatabaseAdapter,添加增 ,删,改,查
5. 在实际中使用:Activity

PerMetaData代码:

public final class PerMetaData {    private PerMetaData() {    }    public static abstract class DogTable implements BaseColumns{        public static final String TABLE_NAME = "dog";        public static final String NAME = "name";        public static final String AGE = "age";    }}

DatabaseHelper代码:

public class DatabaseHelper extends SQLiteOpenHelper {    public static final String DB_NAME = "dog.db";    private static final int VERSION = 1;    public static final String CREAT_ETABLE_DOG = "CREATE TABLE dog(_id INTEGER PRIMARY KEY AUTOINCREMENT," +            " name TEXT,age INTEGER)";    public static final String DROP_TABLE_DOG = "DROP TABLE IF EXISTS dog";    public DatabaseHelper(Context context) {        super(context, DB_NAME, null, VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREAT_ETABLE_DOG);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL(DROP_TABLE_DOG);        db.execSQL(CREAT_ETABLE_DOG);    }}

DatabaseAdapter代码:

public class DatabaseAdapter {    private DatabaseHelper dbHelper;    public DatabaseAdapter(Context context) {        dbHelper = new DatabaseHelper(context);    }    public void add(Dog dog){        SQLiteDatabase db = dbHelper.getWritableDatabase();        ContentValues values = new ContentValues();        values.put(PerMetaData.DogTable.NAME,dog.getName());        values.put(PerMetaData.DogTable.AGE,dog.getAge());        db.insert(PerMetaData.DogTable.TABLE_NAME,null,values);        db.close();    }    public void delete(int id){        SQLiteDatabase db = dbHelper.getWritableDatabase();        String whereClause = PerMetaData.DogTable._ID + "=?";        String[] whereArgs = {String.valueOf(id)};        db.delete(PerMetaData.DogTable.TABLE_NAME,whereClause,whereArgs);        db.close();    }    public void update(Dog dog){        SQLiteDatabase db = dbHelper.getWritableDatabase();        ContentValues values = new ContentValues();        values.put(PerMetaData.DogTable.NAME,dog.getName());        values.put(PerMetaData.DogTable.AGE,dog.getAge());        String whereClause = PerMetaData.DogTable._ID + "=?";        String[] whereArgs = {String.valueOf(dog.getId())};        db.update(PerMetaData.DogTable.TABLE_NAME,values,whereClause,whereArgs);        db.close();    }    public Dog findById(int id){        SQLiteDatabase db = dbHelper.getReadableDatabase();        String[] columns = {PerMetaData.DogTable._ID,PerMetaData.DogTable.NAME,PerMetaData.DogTable.AGE};        Cursor cursor = db.query(true,PerMetaData.DogTable.TABLE_NAME,columns,PerMetaData.DogTable._ID+"=?",new String[]{String.valueOf(id)},null,null,null,null);        Dog dog = null;        if(cursor.moveToNext()){            dog = new Dog();            dog.setId(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable._ID)));            dog.setName(cursor.getString(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.NAME)));            dog.setAge(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.AGE)));        }        cursor.close();        db.close();        return dog;    }    public ArrayList<Dog> findAll(){        SQLiteDatabase db = dbHelper.getReadableDatabase();        String[] columns = {PerMetaData.DogTable._ID,PerMetaData.DogTable.NAME,PerMetaData.DogTable.AGE};        Cursor cursor = db.query(true,PerMetaData.DogTable.TABLE_NAME,columns,null,null,null,null,null,null);        ArrayList<Dog> dogs = new ArrayList<>();        Dog dog = null;        while(cursor.moveToNext()){            dog = new Dog();            dog.setId(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable._ID)));            dog.setName(cursor.getString(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.NAME)));            dog.setAge(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.AGE)));            dogs.add(dog);        }        cursor.close();        db.close();        return dogs;    }    public void rawAaa(Dog dog){        String sql = " insert into dog(name,age ) values(?,?)";        Object[] args = {dog.getAge(), dog.getName()};        SQLiteDatabase db = dbHelper.getWritableDatabase();        db.execSQL(sql,args);        db.close();    }    public void rawdelete(int id){        String sql = "delete from dog where _id= ?";        SQLiteDatabase db = dbHelper.getWritableDatabase();        Object[] args = {id};        db.execSQL(sql,args);        db.close();    }    public void rawupdate(Dog dog){        String sql = "update dog set name =?,age=? where _id= ?";        SQLiteDatabase db = dbHelper.getWritableDatabase();        Object[] args = {dog.getName(),dog.getAge(),dog.getId()};        db.execSQL(sql,args);        db.close();    }    public Dog rawFindById(int id){        SQLiteDatabase db = dbHelper.getReadableDatabase();        String sql = "select _id,name,age from dog where _id=?";        Cursor cursor = db.rawQuery(sql,new String[]{String.valueOf(id)});        Dog dog = null;        if(cursor.moveToNext()){            dog = new Dog();            dog.setId(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable._ID)));            dog.setName(cursor.getString(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.NAME)));            dog.setAge(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.AGE)));        }        cursor.close();        db.close();        return dog;    }    public ArrayList<Dog> rawFindAll(){        SQLiteDatabase db = dbHelper.getReadableDatabase();        String sql = "select _id,name,age from dog";        Cursor cursor = db.rawQuery(sql,null);        ArrayList<Dog> dogs = new ArrayList<>();        Dog dog = null;        while(cursor.moveToNext()){            dog = new Dog();            dog.setId(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable._ID)));            dog.setName(cursor.getString(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.NAME)));            dog.setAge(cursor.getInt(cursor.getColumnIndexOrThrow(PerMetaData.DogTable.AGE)));            dogs.add(dog);        }        cursor.close();        db.close();        return dogs;    }

实体类dog代码:

    private int id;    private String name;    private int age;    /**自己添加getter and setter */

fixedThreadPool的使用

  /**     * 固定大小的线程池     *     * 同时可以处理【参数】个任务,多余的任务会排队,当处理完一个马上就会去接着处理排队中的任务。     * Callable的任务在后面的blog有更详细的文章说明     */    private static void fixedThreadPool(){        ExecutorService es = Executors.newFixedThreadPool(2);        //加入5个任务        for(int i=1 ; i<5; i++){            final int task = i;            es.execute(new Runnable() {                @Override                public void run() {                    for(int j=1; j<=50; j++){                        System.out.println("现在运行的是第【 " + task + "】任务");                        System.out.println(Thread.currentThread().getName() + "is work , now loop to " + j);                        if(j==50){                            System.out.println("任务 【" + task + "】运行完成");                        }                        try {                            Thread.sleep(100);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }            });        }        System.out.println("5个Runnable任务submit完成!!");       /* //加入5个Callable任务,该任务执行完后是有返回值的则会发生堵塞,也就是取到5个任务的结果后才会继续往下走        for(int i=1 ; i<=5; i++){            final int task = i;            Future<Integer> future = es.submit(new Callable<Integer>() {                @Override                public Integer call() throws Exception {                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("Callable 任务【" + task + "】运行");                    return new Random().nextInt(100);                }            });            //如果注释取结果的代码,则不会堵塞            *//*try {                System.out.println("任务【" + i + "】返回的结果:" + future.get());            } catch (Exception  e) {                e.printStackTrace();            }*//*        }        System.out.println("5个Callable任务submit完成!!" + System.currentTimeMillis() );        //虽然shutdown方法是等所有任务跑完后才真正停掉线程池,但该方法不会造成堵塞,也就是这代码运行后,下一行代码会立刻运行        es.shutdown();        System.out.println("主程序shutdown后退出!!" + System.currentTimeMillis());        //暴力的直接终止线程池        //es.shutdownNow();        //awaitTermination方法是堵塞式的,只有等真的把线程池停掉才会让程序继续往下执行        try {            es.awaitTermination(2, TimeUnit.SECONDS);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("主程序后awaitTermination退出!!" + System.currentTimeMillis());*/    }

接口回调和回调接口

简单的接口回掉分四步:
1. 建立一个接口Callback,实现自己需要的方法,这里例举一个方法getProgress(int progress);需要传什么,参数写什么
2. 建立一个 一个接口管理类CallbackUtils,实现方法setCallback(Callback callbck),将实现的接口方法传递到管理类中,实现一个方法getProgresss(int progress)[getProgress可以修改为任意方法名],作用是传递数据给Callback.getProgresss;
3. 在需要传递数据的地方调用管理类中的getProgress方法。
4. 在需要获取数据的地方实现接口,并通过管理类中的setCallback方法传递接口对象。

简单的回调接口的方法:
1. 建立一个接口Callback,实现自己需要的方法,这里例举一个方法getProgress(int progress);需要传什么,参数写什么。
2. 建立一个 一个接口管理类CallbackUtils,写一个startDownload(final ImageStateInterface imageStateInterface,final Context context),这里将实现接口的地方(Activity)传递给了管理类,可以在管理类中调用在Activity中接口的实现方法。比如:
imageStateInterface.getProgress(int progress),这里的getProgress为在Activity中实现的getProgress方法。
3. 在Activity中实现接口和其方法,给管理类调用。

总结:哪里需要使用数据,在哪里实现接口,哪里需要传递数据,在哪里调用方法。


如何实现Broadcast实现Service和Activity之间的通信

前提:需要在A界面点击按钮开启下载服务,当任何时候打开B界面的时候,能过获取服务中下载任务的状态和下载进度
服务中发送广播代码:参考博客

Intent intent = new Intent();         intent.setAction("android.intent.action.MY_RECEIVER"); sendBroadcast(intent);

在Activity中创建一个匿名内部类MyReceive

 private class MyReceiver extends BroadcastReceiver {        @Override            public void onReceive(Context context, Intent intent) {             //修改RecyclerView中指定的Item的ProgressBar            Bundle bundle = intent.getExtras();            int soFarBytes = bundle.getInt(ConstantUtil.SOFARBYTES);            int totalBytes = bundle.getInt(ConstantUtil.TOTALBYTES);            int id = bundle.getInt(ConstantUtil.ID);            String status = bundle.getString(ConstantUtil.STATUS);            mSb.append(id).append("==>").append(status).append("===> soFarBytes = ").append                    (soFarBytes).append("===> totalBytes = ").append(totalBytes).append("\n");//            textTest.setText(mSb.toString());            mDownFragmentRecyclerAdapter = mDownFragment.getAdapter();            mDownFragmentRecyclerAdapter.chargeProgress(id, soFarBytes, totalBytes, status);        }    }

如果获取用户基本信息提交给服务器

需要获取的数据有:

imei 手机的imei,获取不到则为空
Imsi 手机的 imsi,获取不到则为空
Channel 本app安装渠道,在打包的时候会有
Version 本app版本号,打包时会有
Language 手机系统语言
Os 手机操作系统及版本
Model 手机型号
代码:

 public static String getImsi(Context context) {        TelephonyManager tm = (TelephonyManager) context                .getSystemService(Context.TELEPHONY_SERVICE);        String deviceid = tm.getDeviceId();// 获取智能设备唯一编号        String te1 = tm.getLine1Number();// 获取本机号码        String imei = tm.getSimSerialNumber();// 获得SIM卡的序号        String imsi = tm.getSubscriberId();// 得到用户Id        if (imsi != null && !imsi.equals("")) {            return "获取智能设备唯一编号====Deviceid" + deviceid + "\nteleNum" + te1                    + "\nSimNUM" + imei + "\nUserId" + imsi;        }        return "未知";    }    //判读语言    private boolean isZh() {        Locale locale = getResources().getConfiguration().locale;        String language = locale.getLanguage();        if (language.endsWith("zh"))            return true;        else            return false;    }    /**    * 获得手机型号,系统版本,App版本号等信息    */    private String getHandSetInfo(){        String handSetInfo=                "手机型号:" + android.os.Build.MODEL +                        ",SDK版本:" + android.os.Build.VERSION.SDK +                        ",系统版本:" + android.os.Build.VERSION.RELEASE+                        ",软件版本:"+getAppVersionName(ServerActivity.this);        return handSetInfo;    }    //获取当前版本号    private  String getAppVersionName(Context context) {        String versionName = "";        try {            PackageManager packageManager = context.getPackageManager();            PackageInfo packageInfo = packageManager.getPackageInfo("com.home.quhong.test01.Test11Server", 0);            versionName = packageInfo.versionName;            if (TextUtils.isEmpty(versionName)) {                return "";            }        } catch (Exception e) {            e.printStackTrace();        }        return versionName;    }

提交到服务器代码:

 public Boolean submitDataByDoGet(Map<String,String> map,String path) throws Exception {        // 拼凑出请求地址        StringBuilder sb = new StringBuilder(path);        sb.append("?");        for (Map.Entry<String, String> entry : map.entrySet()) {            sb.append(entry.getKey()).append("=").append(entry.getValue());            sb.append("&");        }        sb.deleteCharAt(sb.length() - 1);        String str = sb.toString();        System.out.println(str);        URL Url = new URL(str);        HttpURLConnection HttpConn = (HttpURLConnection) Url.openConnection();        HttpConn.setRequestMethod("GET");        HttpConn.setReadTimeout(5000);        // GET方式的请求不用设置什么DoOutPut()之类的吗?        if (HttpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {            return true;        }        return false;    }

Android延时执行某个任务的操作方法
一、线程

 new Thread(new Runnable(){         public void run(){             Thread.sleep(XXXX);            handler.sendMessage();----告诉主线程执行任务         }     }).start    

二、延时器

TimerTask task = new TimerTask(){      public void run(){       //execute the task         }     };     Timer timer = new Timer();     timer.schedule(task, delay);  

三、android消息处理

new Handler().postDelayed(new Runnable(){        public void run() {        //execute the task        }     }, delay);  

Android 中drawable中selector的使用:

这个没什么好说的,直接上代码简单明了.

<selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_pressed="true">        <shape>            <stroke android:width="1.0px" android:color="@color/white" />            <solid android:color="@color/colorPrimaryDark" />            <corners android:radius="5dp" />        </shape>    </item>    <item android:state_enabled="true">        <shape>            <stroke android:width="1.0px" android:color="@color/white" />            <solid android:color="@color/colorPrimary" />            <corners android:radius="5dp" />        </shape>    </item>    <item android:state_enabled="false">        <shape>            <stroke android:width="1.0px" android:color="@color/white" />            <solid android:color="@color/gray_light" />            <corners android:radius="5dp" />        </shape>    </item></selector>

自定义Toast

时光荏苒,岁月如梭,遥望过去,展望未来,Q1版本已经发布了,激动人心的时刻,即将迎来Q2版本。又得加班加点。简单来个自定义Toast,想必大家都已经知道Toast了,不多赘述:

LayoutInflater inflater = getLayoutInflater();   View layout = inflater.inflate(R.layout.custom,     (ViewGroup) findViewById(R.id.llToast));   ImageView image = (ImageView) layout     .findViewById(R.id.tvImageToast);   image.setImageResource(R.drawable.icon);   TextView title = (TextView) layout.findViewById(R.id.tvTitleToast);   title.setText("Attention");   TextView text = (TextView) layout.findViewById(R.id.tvTextToast);   text.setText("完全自定义Toast");   //一个简单的setView,即可搞定一切   toast = new Toast(getApplicationContext());   toast.setGravity(Gravity.RIGHT | Gravity.TOP, 12, 40);   toast.setDuration(Toast.LENGTH_LONG);   toast.setView(layout);   toast.show();

如何使用Android Studio 统计当前应用的方法和属性总数

遇到问题不要慌,分分钟搞定。
分3步:

  1. 先在app的build.gradle中添加一句:
    // app下的build.gradle配置代码
    classpath ‘com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.1’
  2. 在项目下的build.gradle中添加一句:
    // 项目根目录build.gradle配置代码
    classpath ‘com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.1’
  3. 准备assmeble,就可以在project下的app/build/outputs/dexcount/查到你的应用的方法数和属性数了,如下图:
    这里写图片描述
    ok,结束。

写博客的目的不仅仅是让之后自己能方便快捷的查到之前学过的东西,还有就是能给自己一个交代,至少知道年轻的时候都在做一些什么东西,算是个留恋,其次就是能锻炼下自己的语言能里吧,至少我是这么认为滴!今后博客会努力提高质量………有问题欢迎留言学习交流,微博aserbao

1 0