Android RoboGuice 使用指南3

Hive SQL零基础到精通:100道练习题+答案,SQL能力快速提升 我将以我15年架构与开发的经验,带领大家从零基础到精通,通过精心设计的100道练习题及其详解,系统地、深度地掌握Hive SQL的核心精髓。它可以将结构化的数据文件映射为一张数据库表,并提供了一套类SQL的查询语言——HiveQL(简称HQL),允许熟悉SQL的用户直接查询存储在HDFS上的海量数据。它将Job描绘为DAG(有向无环图),允许更灵活的任务编排,避免不必要的中间落盘,可以复用容器,从而大幅降低延迟。希望你以此文为起点,在广阔的大数据世界里继续遨游,成为一名真正的数据高手! 阅读详情

Android RoboGuice 使用指南(14):Inject View

在例子Android RoboGuice 使用指南(2):第一个例子Hello World 介绍了使用Roboguice开发的基本步骤:

  1. 创建一个RoboApplication 的子类GuiceApplication,GuiceApplication为Appliacation的子类,修改AndroidManifest.xml,将Application 的name 指向这个类。
  2. 将原先由Activity派生的类基类改为RoboActivity(或其它相关Activity).
  3. 如果有需要的话在AbstractAndroidModule 中重载configuatation方法定义bindings.

如果不使用Roboguice,如果Activity中需要访问定义在Layout中的某个View,一般需要使用findViewById 来查找对应的View,并将它强制转换为对应的类,如果需要访问的View很多,重复的代码就非常繁琐。

如果使用Roboguice 的Inject View ,代码就简洁易读多了,@Inject View的基本用法如下:

@InjectView (R.id.xxx)  ViewType  viewInstance;

  • R.id.xxx 为所需View定义在Layout中的id  ,如R.id.textview1
  • ViewType 为所需View的类型,如TextView
  • viewInstance 为变量名。

我们定义一个injectview.xml ,如下:

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>

<TextView 
android:id=”@+id/textview1″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/injectview”
/>

<TextView 
android:id=”@+id/textview2″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/injectview”
/>

<TextView 
android:id=”@+id/textview3″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/injectview”
/>

<TextView 
android:id=”@+id/textview4″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/injectview”
/>

<Button android:id=”@+id/button”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”center_vertical”
android:text=”@string/clickmebutton”/>

</LinearLayout>

定义了4个TextView和一个Button,看看如何使用InjectView来访问这些View:

1 public class InjectViewDemo extends RoboActivity {
2  
3  @InjectView (R.id.button) Button goButton;
4  @InjectView (R.id.textview1) TextView textView1;
5  @InjectView (R.id.textview2) TextView textView2;
6  @InjectView (R.id.textview3) TextView textView3;
7  @InjectView (R.id.textview4) TextView textView4;
8  
9  @Override
10  public void onCreate(Bundle savedInstanceState) {
11  super.onCreate(savedInstanceState);
12  
13  setContentView(R.layout.injectview);
14  goButton.setOnClickListener(mGoListener);
15  }
16  
17  private OnClickListener mGoListener = new OnClickListener()
18  {
19  public void onClick(View v)
20  {
21  textView1.setText("Clicked");
22  textView2.setText("Clicked");
23  textView3.setText("Clicked");
24  textView4.setText("Clicked");
25  }
26  };
27 }

无需使用findViewById 来为每个变量(如textview1)赋值,只需使用@InjectView标记,赋值的工作都由Roboguice 来完成,程序只需向Roboguice说“给我某个View”,Roboguice就通过Dependency Injection传给应用程序所需View的实例对象。代码比不使用Roboguice时简洁多了。

本例下载

 
 

Android RoboGuice 使用指南(15):Inject Context

在Android应用程序中,很多地方需要引用到Context对象(Activity,Application,Service等)。Roboguice 使得引用Context对象变得非常容易。

可以参见下面例子,这里定义一个不在Activity中的类ContextInfo,需要引用Context对象:

1 class ContextInfo{
2  
3  final Context context;
4  @Inject
5  ContextInfo(Context context){
6  this.context=context;
7  }
8  
9  String getPackageName(){
10  return context.getApplicationInfo().packageName;
11  }
12 }

需要应用Context对象时,使用@Inject 标记,Roboguice会自动注入所需Context对象。

定义一个InjectContextDemo,使用一个TextView来显示ContextInfo的getPackageName内容。

1 public class InjectContextDemo extends RoboActivity {
2  
3  @InjectView (R.id.textview) TextView textView;
4  @Inject ContextInfo contextInfo;
5  
6  @Override
7  public void onCreate(Bundle savedInstanceState) {
8  super.onCreate(savedInstanceState);
9  
10  setContentView(R.layout.injectcontext);
11  textView.setText(contextInfo.getPackageName());
12  
13  }
14  
15 }

在InjectContextDemo中定义一个InjectContextDemo,也使用@Inject 通知Roboguice自动创建它的一个实例。Roboguice在创建这个对象时,调用其Injectable 构造函数(参见Android RoboGuice 使用指南(10): Just-in-time Bindings ),自动传入Context对象。

如果需要应用Application对象,可以将构造函数改为

1 @Inject
2  ContextInfo(RoboguiceDemoApplication context){
3  this.context=context;
4 }

或引用Activity

1 @Inject
2  ContextInfo(Activity context){
3   this.context=context;
4 }

本例下载

 

 

Android RoboGuice 使用指南(16):Standard Injection

为方便起见,Roboguice针对Android平台常用的一些对象或服务提供了“标准注入”支持。比如无需使用(SensorManager) getSystemService(SENSOR_SERVICE) 来取得SensorManger 实例,而直接使用@Inject 标记

@Inject SensorManager sensorManager;

Roboguice 自动为sensorManager 注入所需SensorManger 对象, Roboguice支持的标准注入有如下:

@Inject ContentResolver contentResolver;
@Inject AssetManager assetManager;
@Inject Resources resources;
@Inject LocationManager locationManager;
@Inject WindowManager windowManager;
@Inject LayoutInflater layoutInflater;
@Inject ActivityManager activityManager;
@Inject PowerManager powerManager;
@Inject AlarmManager alarmManager;
@Inject NotificationManager notificationManager;
@Inject KeyguardManager keyguardManager;
@Inject SearchManager searchManager;
@Inject Vibrator vibrator;
@Inject ConnectivityManager connectivityManager;
@Inject WifiManager wifiManager;
@Inject InputMethodManager inputMethodManager;
@Inject SensorManager sensorManager;

我们使用SensorManager 为例,说明一下Standard Injection的用法,本例基于Android ApiDemos示例解析(90):OS->Sensors 。

修改

private SensorManager mSensorManager;

为

private @Inject
SensorManager mSensorManager;

去掉onCreate 中的

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

运行实例,可以看出不用使用getSystemService,Roboguice自动为mSensorManager 赋了值。

本例下载

 

 

Android RoboGuice 使用指南(17):Inject Extra

使用Intent 启动一个Activity,Service等时,可以通过putExtra 传送数据,被触发的Activity,Service可以使用getIntent()的getExtras 取的Extra的Bundle ,然后再根据Extra的键值(Key)取的对应的参数值。

RoboGuice提供了一个简洁的方法来取得 这些Extra 值,通过@InjectExtra 标记。

本例使用两个Activity,InjectExtraDemo 用来触发InjectExtraReceiver,在InjectExtraDemo中创建Intent时,通过putExtra 放置两个参数Extra1,Extra2.

1 public class InjectExtraDemo extends RoboActivity {
2  
3  @InjectView (R.id.button) Button button;
4  @Inject Context context;
5  
6  
7  @Override
8  public void onCreate(Bundle savedInstanceState) {
9  super.onCreate(savedInstanceState);
10  setContentView(R.layout.injectextra);
11  button.setOnClickListener(mGoListener);
12  }
13  
14  private OnClickListener mGoListener = new OnClickListener()
15  {
16  public void onClick(View v)
17  {
18  Intent di = new Intent();
19  di.setClass(context, InjectExtraReceiver.class) ;
20  di.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
21  | Intent.FLAG_ACTIVITY_SINGLE_TOP);
22  di.putExtra("Extra1","Message1");
23  di.putExtra("Extra2","Message2");
24  context.startActivity(di);
25  }
26  };
27  
28 }

在InjectExtraReceiver 通过@InjectExtra 标记 ,Roboguice自动为这些变量注入由Intent传入的值,Optional=true表示该Extra为可选,如果传入的Intent不含这个Extra时,值为null.

1 public class InjectExtraReceiver extends RoboActivity{
2  
3  @InjectView (R.id.textview) TextView textView;
4  @InjectExtra ("Extra1" ) String extra1;
5  @InjectExtra ("Extra2" ) String extra2;
6  @InjectExtra (value="Extra3" , optional=true) String extra3;
7  
8  @Override
9  public void onCreate(Bundle savedInstanceState) {
10  super.onCreate(savedInstanceState);
11  
12  setContentView(R.layout.injectextrareceiver);
13  
14  textView.setText("Extra1:"+extra1
15  +"\r\nExtra2:"+extra2
16  +"\r\nExtra3:"+extra3);
17  
18  }
19  
20 }

本例下载

 

Android RoboGuice 使用指南(18):Inject Resources

Roboguice 对访问res 目录下各种资源drawable, arrary, string 等也提供了注入支持。可以通过@InjectResource 很方便的应用所需资源。

本例修改Android ApiDemos示例解析(48):Content->Resources->Resources 使用Inject Resource方法来访问资源。

1 public class InjectResourceDemo extends RoboActivity {
2  
3  @InjectView (R.id.styled_text) TextView styled_text;
4  @InjectView (R.id.plain_text) TextView plain_text;
5  @InjectView (R.id.res1) TextView res1;
6  @Inject Resources res;
7  @InjectResource(R.string.styled_text) String str;
8  
9  
10  @Override
11  public void onCreate(Bundle savedInstanceState) {
12  super.onCreate(savedInstanceState);
13  setContentView(R.layout.injectresource);
14  
15  //Use res to get the string resources
16  CharSequence cs=res.getText(R.string.styled_text);
17  // Note the use of
18  // CharSequence instead of String
19  // so we don't lose the style info.
20  styled_text.setText(cs);
21  
22  // Use the same resource, but convert it to
23  // a string, which causes it
24  // to lose the style information.
25  plain_text.setText(str);
26  res1.setText(cs);
27  
28  }
29  
30 }

本例下载

 

Android RoboGuice 使用指南(19):发送接收Events

Roboguice 提供了对Context 生命周期相关的事件的send 和receive ,系统缺省支持的事件为:

  • OnActivityResultEvent
  • OnConfigurationChangedEvent
  • OnContentChangedEvent
  • OnContentViewAvailableEvent
  • OnCreateEvent
  • OnDestroyEvent
  • OnNewIntentEvent
  • OnPauseEvent
  • OnRestartEvent
  • OnResumeEvent
  • OnStartEvent
  • OnStopEvent

一个简单的例子如下:

1 public class MyActivity extends RoboActivity {
2  // You must "register" your listener in the current
3  // context by injecting it.
4  // Injection is commonly done here in the activity,
5  //but can also be done anywhere really.
6  @Inject protected MyListeners myListeners;
7  
8 }
9  
10  
11 // In this example, all the listeners are in a
12 // MyListeners class, but really they could
13 // be anywhere as long as it's registered.
14 // You can even put the listeners directly into
15 // your activity classes if you like!
16 class MyListeners {
17  
18  // Any method with void return type and a
19  // single parameter with @Observes annotation
20  // can be used as an event listener.
21  //This one listens to onResume.
22  public void doSomethingOnResume(
23  @Observes OnResumeEvent onResume ) {
24  Ln.d("Called doSomethingOnResume in onResume");
25  }
26  
27  // As you might expect, some events can
28  //have parameters.  The OnCreate event
29  // has the savedInstanceState parameter that
30  //Android passes to onCreate(Bundle)
31  public void doSomethingElseOnCreate(
32  @Observes OnCreateEvent onCreate ) {
33  Ln.d("onCreate savedInstanceState is %s",
34  onCreate.getSavedInstanceState())
35  }
36  
37  // And of course, you can have multiple
38  //listeners for a given event.
39  // Note that ordering of listener execution
40  //is indeterminate!
41  public void xxx( @Observes OnCreateEvent onCreate ) {
42  Ln.d("Hello, world!")
43  }
44 }

有关Events的注意事项如下:

  • 在Context中使用@Inject定义事件的Listener.
  • Event只能在某一特定的Context(Activity)中传送,不能跨Context发送,接受。
  • Event除了提供上面列出的Context相关事件外,也可以使用自定义的事件。
  • @observes 只能应用到方法上,而不能应用到构造函数上。

下面使用一个自定义事件MyEvent,通过observer 这个自定义事件来发送,接收自定义事件。

1 public class EventDemo extends RoboActivity {
2  
3  @Inject protected EventManager eventManager;
4  @InjectView (R.id.button) Button button;
5  
6  @Override
7  public void onCreate(Bundle savedInstanceState) {
8  super.onCreate(savedInstanceState);
9  setContentView(R.layout.eventdemo);
10  button.setOnClickListener(mGoListener);
11  }
12  
13  private OnClickListener mGoListener = new OnClickListener()
14  {
15  public void onClick(View v)
16  {
17  eventManager.fire(EventDemo.this,new MyEvent());
18  }
19  };
20  
21  
22  protected void handleEvent(@Observes MyEvent event){
23  Toast.makeText(this, "Custom event",
24  Toast.LENGTH_LONG).show();
25  }
26 }
27  
28  
29 class MyEvent{
30  //put any memeber you want here.
31 }

本例下载


CPU 访问外设的两种核心机制:MMIO(Memory-Mapped I/O) 和 DMA(Direct Memory Access) BAR和DMA是计算机系统中两种关键的数据传输机制:BAR(基址寄存器)用于CPU与设备间的控制通信,映射设备寄存器便于配置操作;而DMA(直接内存访问)允许设备直接读写系统内存,无需CPU参与大量数据传输。典型场景如NVMe SSD读取数据时,CPU通过BAR下发指令,设备通过DMA高效传输数据到主机内存,最后中断通知CPU。虽然BAR能映射大内存空间,但仍无法替代DMA的高效数据传输功能,两者各司其职——BAR负责控制,DMA专注数据传输,共同实现高性能的硬件交互。 阅读详情

相关推荐

玩转Zabbix智能告警:降噪、排班、认领、升级、IM协同

集成Zabbix告警到FlashDuty,获得告警降噪、智能排班、IM协同等能力

n9ecommunity的博客 1035

Android开发使用RoboGuice3.0框架进行注入

githuab地址: https://github.com/roboguice/roboguice/wiki/InstallationGradle https://github.com/google/guice/wiki 其中3.0之后没有的方法EventManager的fire(),RoboApplication (2.*之后就没了),还有就是设置model,现在好像只能通过xml

Hoist the Colours! Our world is wide! 976

《湖科大教书匠计算机网络》学习笔记总目录+思维导图

本篇文章是对《湖科大教书匠计算机网络》所有知识点的笔记总结归档和计算机网络的思维导图

weixin_73077810的博客 8230

Android RoboGuice 使用指南(3):Bindings 概述

一个应用中类于类之间的依赖关系可能非常复杂,创建于个类实例,需要先创建类所依赖的类的示例,而创建所依赖类的实例,这些类又可能依赖其它类,以此类推。因此在创建一个类实例时,你正在需要创建的是一个对象图对象(Object Graph)。 手工创建Object Graph 是一个非常繁琐而且容易出错的过程,并且很难对代码进行测试,而Guice或Roboguice可以帮助你创建Object Graph,

引路蜂移动软件 5274

基于smart_rtmp直播,最简单的部署手册

版本号 添加内容 修改时间 V1.0 新建 2021年12月30日 V1.1 增加网页播放 2021年12月31日 V1.2 增加是否可以多流和测试数据 2022年1月5日 目录 一、软件储备 1.推流软件:OBS 2.服务器流媒体软件:smart_rtmp 3.播放软件:Pot...

qq_28768477的博客 1万+

Intel Mobileye EyeQ Ultra:RISC-V架构的L4自动驾驶芯片解析

RISC-V作为开源指令集架构,凭借其模块化设计和可定制特性,正在重塑高性能计算领域。其精简指令集带来的确定性执行时序,特别适合自动驾驶等实时性要求严苛的场景。在异构计算架构中,RISC-V与专用加速器(如NPU、GPU)的协同设计,能显著提升能效比和算力密度。Mobileye EyeQ Ultra采用12核RISC-V集群,结合176TOPS AI加速器和5nm工艺,实现了L4级自动驾驶所需的实时感知与决策能力。这种架构为车载计算平台提供了可扩展的解决方案,同时降低了系统复杂度和BOM成本。

weixin_33245447的博客 426

Android RoboGuice2 使用指南(3): Inject 自定义View

前面介绍了Android RoboGuice2 的HelloWorld示例,并介绍了从RoboGuice 1.1 升级到RoboGuice2.0 的主要注意事项。其它的基本概念和RoboGuice1.1基本一样,可以参见 Android RoboGuice 使用指南(3):Bindings 概述Android RoboGuice 使用指南(4):Linked BindingsAndroid

引路蜂移动软件 5690

从零到一:Livox Mid-360 激光雷达的硬件集成与避坑实战

本文详细介绍了Livox Mid-360激光雷达的硬件集成全流程,包括硬件准备、网络配置、驱动编译和常见问题解决方案。通过实战经验,帮助开发者高效完成从设备拆箱到数据输出的完整链路,避免在IP设置、驱动编译和固件兼容性等环节踩坑。

salt的博客 1028

RoboGuice下载和安装

Installation 下载 RoboGuice 和 guice-2.0-no_aop.jar (not guice-3.0). 创建一个Android项目, 使用1.5以上的平台版本(api lever 3 和 SDK version 3 以上)3. 给Android项目增加两个jar Eclipse : Project > Properties > Java Build Path > L

849

SAP UI5 控件剖析系列之 sap.m.DatePicker:单日选择的工程化用法、最佳实践与常见坑

在 SAP UI5 的输入控件族里,是最常被使用的日期选择控件。它把一个可编辑的输入框与一个弹出的日历整合在一起,允许用户用触摸、鼠标或键盘在本地化格式下选择某一天;控件既可以从弹出的日历里点选,也可以直接在输入框里键入日期。官方 Fiori 设计规范对它的定位就是:完成单个日期的选择,不牵涉时间,也不负责跨天的范围选择。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 343

hwasan实例分析踩内存之七:CamX进程chifeature2base怪异的Cause: use-after-free

摘要:本文分析了高通camx进程中的指针异常crash问题,通过构建hwasan版本确认存在内存踩踏现象。日志显示为"use-after-free"类型错误,具体为线程T175672在已释放内存区域执行写入操作。堆栈分析表明ChiFeature2Base::PipelineDestroyCb()函数访问了已被ChiFeature2Base::DestroyFeatureData()释放的pPipelineData对象。该问题源于多线程环境下内存管理不同步,导致释放后仍被引用。解决方案通过

1077

【十一】注入框架RoboGuice使用:(Your First Injection into a Custom View class)

上一篇我们简单的介绍了一下RoboGuice的使用(【十】注入框架RoboGuice使用:(Your First Testcase)),今天我们来看下自定义View的注入(Custom View)。           在开始本文之前,你先要熟悉普通Java对象的注入(点击进入)。在RoboGuice 3.0版本中你同样给自定义View(Custom View)进行诸如。 class

江清清的专栏 2424

simulink的Sine Wave 模块详解

模块是 Simulink 中的一个信号源模块,用于生成正弦波信号。该模块可以根据设定的幅值、频率、相位和偏移量,在仿真过程中产生周期性的正弦波形。模块都能提供强有力的支持。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常实用的工具,适用于需要生成正弦波信号的各种场景。模块的参数,可以进一步增强学习体验。模块参数的影响,下面我们将详细探讨每个参数如何影响仿真结果。

xiaoheshang_123的博客 1052

【八】注入框架RoboGuice使用:(Your First Injected Fragment)

上一篇我们简单的介绍了一下RoboGuice的使用(【七】注入框架RoboGuice使用:(Your First Custom Binding)),今天我们来看下fragment的注解    (一):简介:和Activity一样,我们也同样可以在Fragment中使用注解,你需要一下的步骤.           ①:编写一个继承与RoboFragment的Fragment;      

江清清的专栏 2607

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

roboguice3.0使用心得

roboguice3.0在eclipse下使用遇到问题,记录如下: 1. 安装说明网址:https://github.com/roboguice/roboguice/wiki/InstallationNonMaven 2. 遇到问题及解决方法 a. 问题:2015-08-06 10:42:04 - Dex Loader] Unable to execute dex: Multiple d

88zombie88的专栏 1028

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android RoboGuice2 使用指南(1): 概述

RoboGuice最近推出了2.0版本。和1.1相比具有: 提高了稳定性支持Fragment更简洁易用 但由于RoboGuice2 不完全向下兼容RoboGuice1.1,因此原来使用RobuGuice1.1开发的项目需要对代码做些修改才可以使用RoboGuice2.0. 这里主要说明一下使用Eclipse IDE开发环境升级到RoboGuice2.0 的一些升级注意事项: 1. 下载

引路蜂移动软件 7506

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android RoboGuice 使用指南1

转载于:http://www.imobilebbs.com/wordpress/archives/2480 Android RoboGuice 使用指南(1):概述 在开发应用时一个基本原则是模块化,并且近最大可能性地降低模块之间的耦合性。在Java平台上Spring Framework 以及.Net 平台 CAB ,SCSF 和Prism (WPF

Chuekup的专栏 2006

Android RoboGuice2 使用指南 1 概述

Android RoboGuice2 使用指南 1 概述

bcghgfr的博客 182

android roboguice2,Android 的RoboGuice介绍

RoboGuice 使得进行Android开发更加方便,使得开发变得更加简单也更有乐趣。当你调用getIntent().getExtras()是不是经常检查是否为null?RoboGuice可以帮助你。想想调用findViewById()并映射到TextView确实有必要么?RoboGuice也可以帮你。RoboGuice 可以帮助解决这类的判断工作。你再也不用记住,是通过调用bindServic...

weixin_42514562的博客 237
上一篇: Android实现获取系统应用列表
下一篇: android怎样调用@hide和internal API
Chuekup
博客等级 码龄15年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值