Android应用开发—知识点汇总

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77113335 获取Fragment的context: getActivity().
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77113335
  • 获取Fragment的context:
   getActivity().getApplicationContext()或者getActivity()
   You can use getActivity(), which returns the activity associated with a fragment.
   The activity is a context (since Activity extends Context).
  • 设置TextView的颜色setTextColor()的用法:
 setTextColor(0xff999faa);
 setTextColor(Color.parseColor("#999faa"))
  • Android textView 动态设置字体大小,带单位:
setTextSize(TypedValue.COMPLEX_UNIT_PX,22); 
setTextSize(TypedValue.COMPLEX_UNIT_SP,22); 
setTextSize(TypedValue.COMPLEX_UNIT_DIP,22);
  • 初始化一个ArrayList<>并赋值:
ArrayList<String> list = new ArrayList<String>() {{add("string1"); add("string2"); add("string3");}}
  • setBackgroundDrawable和setBackgroundResource的区别:
setBackgroundXXX的用处,设置View背景。
setBackgroundDrawable的参数为Drawable对象。
setBackgroundColor的参数为Color对象,比如说Color.Red为红色或  Color.rgb(255,0,0)来指定一个红色
setBackgroundResource的参数为资源ID,比如说R.drawable.icon

对于ImageView类有类似 setImageXXX
道理同上,setImageBitmap的参数为Bitmap对象,同时ImageView还支持矩阵对象,比如setImageMatrix的参数为Matrix对象。
  • Android延时执行接口:
new Handler().postDelayed(new Runnable(){
    @Override
    public void run() {
        func();
    }
}, 250);
  • 查看Android系统服务命令:
adb shell service list
  • Activity有三种基本状态:

    • Active:处于屏幕前景(当前task的栈顶Activity处于Active状态),同一时刻只能有一个Activity处于Active状态。
    • Paused状态:处于背景画面画面状态,失去了焦点,但依然是活动状态。
    • Stopped:不可见,但依然保持所有的状态和内存信息。
  • 同一个Service的类在android中可以有多个实例吗?
    不可以。Service的启动模式决定它不会在系统中存在多个实例,当有新的Intent传递过来的时候,android系统会直接使用已经存在的Service实例而不会重新创建,所以在android系统中的Service都是单例的。

    但为什么在锤子手机上有好几个xstate service???

  • android继承activity和application有什么不同:
    初学安卓,看到有些代码继承activity,有些继承application,不知有什么?
    Activty是UI界面的抽象,Application是应用程序的抽象。一个Application有若干个Activity组成。一般继承Application主要是做一些初始化以及获取全局Context的引用,每个用户界面都要继承自Acitivity。

  • Fragment中调用startActivityForResult:
    注意要采用fragment的startActivityForResult,而不要通过activity调用,否则activity的onActivityResult回被回调,fragment不会被调用,这样start和onResult就分离了。
    目前还没有遇到这个问题,先收藏着
    彻底搞懂startActivityForResult在FragmentActivity和Fragment中的异同
    浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

  • 去除字符串中的标点符号

public static String removePunct(String s) {
    String str = s.replaceAll("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?|-]", "");
    str = str.replace("\"", "");
    return str;
}
  • 判断字符串中是否都是中文字符
public static boolean isChinese(String string) {
      String regex = "^[\u4E00-\u9FA5]+$";
      Pattern pattern = Pattern.compile(regex);
      Matcher match = pattern.matcher(string);
      return match.matches();
  }

“我在上一篇文章中曾说过,我并不喜欢Android中的Bundle,而且尽量避免使用它们。我不喜欢被象Serializable或者是Parcelable这类对象所约束,尤其是它们还缺少对类型安全的检查。我的意思是必竟这是Java,而不是Python或者Javascript什么的。我希望我的IDE能够发现并告诉我这样的错误,如一个组件向另外一个组件发送了一个不是它期望的对象类型。
不要误会,Intent在进程间通信时还是很有用的,在这种情况下将携带的数据序列化成通用格式是合情合理的。但如果仅仅是为了在用户旋转了一下屏幕后,让程序保持原来的状态,以科学的名义说,有必要非得用这种方法么?没错,我说的就是Android提供的处理配置改变的标准模式——在onSaveInstanceState(Bundle bundle)和onRestoreInstanceState(Bundle bundle)中保存和恢复状态数据。且不提那些荒唐复杂的Fragment生命周期问题,单单是保持运行状态的这种处理方式就是我最不喜欢的Android开发特点之一。” 刚刚遇到了类似问题:Parcel android.os.Parcel@dbaf03f: Unmarshalling unknown type code 2131625126 at offset 1308 导致了crash
XXXX info = mXXXXList.get(position);
if (info == null) {
    return;
}
Intent intent = new Intent(XXXXActivity.this, XXXXActivity.class);
intent.putExtra(XXX.KEY_SOUND_INFO, info);

if (intent != null) {
    mXXXX = (XXXX) intent.getSerializableExtra(XXX.KEY_SOUND_INFO);
}
由于Serializable导致的问题,出现几率比较小,目前还没找到原因。
  • AsyncTask, Loader和Executor…… 拜托!

摘录自Android 中 EventBus 的使用(3):多线程事件处理

Android中有很多种执行异步操作的方法(指平行于UI线程的)。AsyncTask对于用户来说是最简单的一种机制,并且只需要少量的设置代码即可。然而,它的使用是有局限的,正如Android官方文档中所描述的:

AsyncTask被设计成为一个工具类,在它内部包含了Thread和Handler,但它本身并不是通用线程框架的一部分。AsyncTask应该尽可能地被用在执行一些较短的操作中(最多几秒)。如果你需要在线程中执行较长时间的任务,那么建议你直接使用java.util.concurrent包中提供的各种API,如Executor、 ThreadPoolExecutor以及FutureTask。

不过即便是执行短时间的操作也会带来一些问题,特别是在与Activity/Fragment生命周期有关的地方。由于AsyncTask会持续地运行下去(即使启动它们的Activity/Fragment已经被销毁了)。这样,一旦你在onPostExecute方法中试图对UI进行更新,那么最终将导致抛出一个IllegalStateException异常。

Android 3.0中引入了Loader API用来解决Activity/Fragment生命周期的问题(它们的确很有效)。Loader API被设计成向Activity/Fragment中以异步方式加载数据。尽管加载数据是一种非常常见的异步操作,但并非唯一一种需要从UI线程中分开的操作。Loader还需要在Activity/Fragment中实现另外一个监听接口。尽管这么做没有错,但我个人并不喜欢这种模式(我的意思是最终你的代码中会包含许多的回调函数,导致代码的可读性变得很差)。最后,Activity和Fragment也并非唯一需要对异步操作分线程的地方。例如如果在Service里,你就不能访问LoaderManager,所以最终你还是得使用AsyncTask或者java.util.concurrent。

java.util.concurrent包很不错,我在Android和非Android项目中都可以使用。不过使用时需要对其进行多一点儿配置和管理,不象AsyncTask那么简单。你需要对ExecutorService进行初始化,管理和监视它的生命周期,并且可能需要跟一些Future对象打交道。

只要使用恰当,AsyncTask、 Loader和Executor都是非常有效的。但在复杂应用中,需要为每个任务选择合适的工具,最终你可能三种都会用到。这样你就得维护三种不同的处理并发的框架代码。

  • RelativeLayout布局内组件设置居中
    备忘
android:layout_centerVertical="true"
  • 设置渐变色的背景
    设置背景色可以通过在res/drawable里定义一个xml,如下:
xxx.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <item>
        <shape>
            <gradient
                android:angle="0"
                android:endColor="#28d5fa"
                android:startColor="#0083fa"
                android:type="linear" />
        </shape>
    </item>

</layer-list>

引用:

<RelativeLayout
                android:id="@+id/va_voice_print_step_ll"
                android:layout_width="match_parent"
                android:layout_height="149dp"
                android:background="@drawable/xxx">
</RelativeLayout>

shape:定义形状(主要包括方形、圆形等);gradient:定义该形状里面为渐变色填充;startColor:起始颜色;endColor:结束颜色;angle:表示方向角度。(当angle=0时,渐变色是从左向右。 然后逆时针方向转,当angle=90时为从下往上)。

gradient主要配置起点颜色、终点颜色、中间点的坐标、中间点的颜色、渐变角度(90度为上下渐变,0为左右渐变);
padding主要配置上下左右边距;
corners节点配置四周园角的半径;
参考链接:Android (shape,gradient)使用总结android 背景渐变色(shape,gradient)

  • 如果在Android中判断某个线程是否是主线程?
public static boolean isInMainThread() {
      return Looper.myLooper() == Looper.getMainLooper();
}
  • EditText中灰色文字提示
android:hint="请输入xx"
  • 如何查看Activity Task栈的情况
adb shell dumpsys activity activities
adb shell dumpsys activity top
  • 打开app对应设置通知中心
public void openNotificationSettings() {
    try {
        Intent intent = new Intent();
        intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
            intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            intent.putExtra("app_package", context.getPackageName());
            intent.putExtra("app_uid", context.getApplicationInfo().uid);
        }
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • gradle里面的cached module文件位置
~/.gradle/caches/modules-2/files-2.1/com.ali*
  • 判断app是否在前台运行
 public boolean isAppOnForeground() {
    // Returns a list of application processes that are running on the
    // device

    ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    String packageName = getApplicationContext().getPackageName();

    List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
            .getRunningAppProcesses();
    if (appProcesses == null)
        return false;

    for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
        // The name of the process that this object is associated with.
        if (appProcess.processName.equals(packageName)
                && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            return true;
        }
    }
    return false;
}
  • Activity内使用Broadcast接收消息

    大部分的Broadcast示例都是新建一个class继承BroadcastReceiver来说明Broadcast的使用,但是这个class中接收到的消息,如何进行后续处理呢?其实大部分情况下是希望在activity中通过Broadcast接收消息,做一些后续的处理工作,而如果在一个新建的继承自BroadcastReceiver的class中,如何和某个Activity通讯,这是一个悖论,消息发生源传递给Broadcast,Broadcast再传递给Activity,后一步要采用什么通讯方式呢?为什么不消息发生源不直接发生消息给Activity呢?

    由于大部分示例都是在一个新的class中进行,导致我一度认为Broadcast只能写在class里。后来发现可以通过动态注册的方式直接new一个BroadcastReceiver的方式,写在Activity内部,由于BroadcastReceiver在Activity内部,BroadcastReceiver中onReceive()即可操作Activity内数据和控件,实现Activity接受消息的目的。

private BroadcastReceiver mSearchRequestReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
          //do somethings
          }
      }
  };

  @Override
  public void onResume() {
      super.onResume();
      LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
      lbm.registerReceiver(mSearchRequestReceiver, new IntentFilter(SEARCH_REQUEST_BROADCAST_ACTION));
  }

  @Override
  protected void onPause() {
      super.onPause();
      LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
      lbm.unregisterReceiver(mSearchRequestReceiver);
  }
  • 判断当前线程是否是Ui线程:
public static boolean isMainThread() {
        return Thread.currentThread() == Looper.getMainLooper().getThread();
}
  • Glide.with()使用
with(Context context):使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。
with(Activity activity):使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。
with(FragmentActivity activity):Glide的请求会受到FragmentActivity生命周期控制。
with(android.app.Fragment fragment):Glide的请求会受到Fragment 生命周期控制。
with(android.support.v4.app.Fragment fragment):Glide的请求会受到Fragment生命周期控制。
目录
相关文章
|
3月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
303 4
|
3月前
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
3月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
8天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
66 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
6天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
24 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
88 14
|
2月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
2月前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
2月前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
3月前
|
缓存 监控 前端开发
探索Android应用开发之旅:从新手到专家
【10月更文挑战第42天】本文将带你踏上Android应用开发的旅程,无论你是初学者还是有经验的开发者。我们将一起探索如何从零开始创建你的第一个Android应用,并逐步深入到更高级的主题,如自定义视图、网络编程和性能优化。通过实际示例和清晰的解释,你将学会如何构建高效、吸引人的Android应用。让我们一起开启这段激动人心的旅程吧!

热门文章

最新文章