Android-安卓四大组件详解及代码示例

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。

Activity:

通常用于显示一个单独的界面,例如从app A点击某个按钮,跳到app B的某个界面,在此界面可以设置某些功能,设置完成之后这个界面就没有其他用途。这种场景就适合用activity。

具体实现就是app A在按钮响应事件中发送intent,app B中对此intent做响应,启动activity。

app B中Activity的具体启动如下:

step1: 在AndroidManifest.xml文件中加入下列描述。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.xxxx"
    <application
        <activity 
		android:name="test_activity"
            <intent-filter>
                <action android:name="android.intent.action.RECORD_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

step2: 创建test_activity.java在这个文件里面完成自己的代码.

public class test_activity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) { 
     // 这个是intent发送之后启动这个activity自动调用的
        super.onCreate(savedInstanceState);
        setContentView(R.layout.voiprecord_settings); 
     // 此处可以加入自己的界面布局等东西
    }
	@Override
	public void setContentView(View view) {
        super.setContentView(view);
        // do something here
	}
}

如果app A还没完成,需要自己测试activity是否成功创建可以用下面的命令:

adb shell am start -a android.intent.action.RECORD_SETTINGS -n com.android.xxxx/com.android.xxxx.test_activity

参数解释:

-a: 表示action (android.intent.action.RECORD_SETTINGS)

-n: 表示packagename/activity的name,此处需要注意,这两者必须都有。

 

BroadcastReceive:

应用可以过滤自己感兴趣的广播事件并对此做出响应(例如启动activity,server等)。例如,在拨打电话的时候系统广播一个calling广播事件,然后录音app监听到有这个广播就停止录音。

那么广播是怎么发送出去的呢?

1. 普通广播的发送

   Context.sendBroadcast(Intent myIntent)

2. 有序广播的发送

 Context.sendOrderedBroadcast(intent, receiverPermission) 这个广播可以设置消息的优先级,优先处理高优先级的消息,同优先级先后随机

广播发送之后怎么被监听处理?

step1:在AndroidManifest.xml文件中加入下列描述。

<receiver android:name="com.android.xxxx.MyBroadcastReceiver" >
  <intent-filter android:priority = "2147483647" >
    <action android:name="android.media.Telephony.calling" />
  </intent-filter>
</receiver >

step2: 创建MyBroadcastReceiver.java在这个文件里面完成自己的代码.

// eg: 收到消息后启动MyServer
import android.content.BroadcastReceiver;
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) { 
       // 收到消息后自动调用onReceive
        Intent serviceIntent = new Intent(context, MyServer.class); 
        // 传入MyServer.class
        int state = intent.getIntExtra("state", 0);
        serviceIntent.putExtra("state", state);
        context.startService(serviceIntent); // 启动MyServer
    }
}
// 注意!!! onReceive的生命周期只有10s左右,如果在此做超过10s的处理就会上报ANR。所以建议耗时的工作都放到server里面。

step3: 完成MyServer代码(MyServer.java)

public class MiuiMonitoringService extends Service {
       @Override
    public void onCreate() { // server启动之后最先执行的函数,在这里做一些初始话等工作
        super.onCreate();
        // 可以在此先做一些初始化工作
        // 然后new 一个handler去处理监听到的广播
        mHandler = new MyHandler();
    }
    private class MyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == calling_start) { // 例如收到了开始打电话
                 closesoundrecord(); // 关闭录音
            } else if (msg.what == calling_stop) { // 收到了结束打电话
                startsoundrecord(); // 开始录音
            }
        }
    }
} 

tips: 此处还有一个有意思的事情,app可以通过接收广播来启动server(静态广播),server启动之后还可以设置其他的广播监听事件(动态广播)。例如,我们发现打电话时启动Myserver,然后在server中,我们再去监听当前是否有耳机插入,如果有耳机插入再去其他操作。话不多说,看代码:

public class MiuiMonitoringService extends Service {
       @Override
    public void onCreate() {
        super.onCreate();
        getApplicationContext().registerReceiver(mIntentReceiver, new IntentFilter(AudioManager.ACTION_HEADSET_PLUG)); // 注册广播监听
    }
    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) { // 监听到有耳机插入事件
            if (intent.getAction().equals(AudioManager.ACTION_HEADSET_PLUG)) {
                 // 响应事件
            }
        }
    };
    @Override
    public void onDestroy() {
        getApplicationContext().unregisterReceiver(mIntentReceiver); // onDestroy的时候需要反注册receiver
    } 
}

Service:

  上面的broadcast里面我们已经大概了解过server。sever可以在broadcastreciver中被启动也可以在activity中被启动,也可以在其他server中被启动。

server的启动方法:

1. startService()

Intent serviceIntent = new Intent(context, MyServer.class); // 传入MyServer.class
int state = intent.getIntExtra("state", 0);
serviceIntent.putExtra("state", state);
context.startService(serviceIntent); // 启动MyServer

  此方法启动的服务和调用者没有关系,即使调用者关闭了,服务仍然可以运行。此方法启动时,服务首次启动系统先调用服务的onCreate()-->onStart(),如果服务已经启动则只触发onStart()方法。停止服务要调用Context.stopService(),此时系统会调用onDestory()。

2. bindService()

mContext.bindService(new Intent().setComponent(new ComponentName(SYSTEM_SERVICE_PACKAGE,
                SYSTEM_SERVICE_PACKAGE + ".TelecomCallService")),
                new BinderServiceConnection(), Context.BIND_AUTO_CREATE);

此方法启动的服务与调用者绑定,只要调用者关闭服务就终止。服务首次启动系统先调用服务的onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法。调用者退出时系统会调用服务的onUnbind()-->onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-->onDestory()。

另外,app中的server都必须在AndroidManifast.xml中配置。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  <application
     <service android:name="com.android.xxxx.MyService" android:exported="false"/>
    </application>
</manifest>     

Content Provider:

android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式,

其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据.(相当于在应用外包了一层壳),

只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中

它的好处:统一数据访问方式。

此组件暂未用到,后面用到了会更新demo。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Integration MQTT 提供了一个方便的方式来集成 MQTT 客户端到 Spring 应用程序中。下面是一个示例代码,演示如何在 Spring Integration 中使用 MQTT 子协议实现多个主题的订阅。 首先,需要在 Spring 配置文件中声明 MQTT 连接工厂和 MQTT 输入通道: ```xml <bean id="mqttClientFactory" class="org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory"> <property name="userName" value="${mqtt.username}" /> <property name="password" value="${mqtt.password}" /> </bean> <int-mqtt:message-driven-channel-adapter id="mqttInbound" client-factory="mqttClientFactory" auto-startup="true" url="${mqtt.url}" topics="topic1,topic2,topic3" qos="2" converter="mqttDefaultPahoMessageConverter" channel="mqttInputChannel"/> ``` 在这个示例中,我们使用 `DefaultMqttPahoClientFactory` 来创建 MQTT 连接工厂,`mqtt.username` 和 `mqtt.password` 属性用于设置连接的用户名和密码。`mqttInbound` 是一个消息驱动的通道适配器,用于从 MQTT 代理服务器接收消息。`mqtt.url` 属性设置了 MQTT 服务器的 URL,`topics` 属性设置了要订阅的主题列表,`qos` 属性设置了消息的服务质量,`converter` 属性设置了消息转换器,`mqttInputChannel` 是一个输入通道,用于接收 MQTT 消息。 接下来,可以在 Spring 配置文件中声明一个消息处理器,用于处理接收到的 MQTT 消息: ```xml <int:service-activator input-channel="mqttInputChannel" ref="mqttMessageHandler" method="handleMessage"/> <bean id="mqttMessageHandler" class="com.example.MqttMessageHandler"/> ``` 在这个示例中,我们使用 `service-activator` 元素来声明一个消息处理器,`mqttInputChannel` 是输入通道,`mqttMessageHandler` 是消息处理器的引用,`handleMessage` 方法用于处理接收到的消息。`MqttMessageHandler` 是一个自定义的消息处理器,它实现了 `MessageHandler` 接口: ```java public class MqttMessageHandler implements MessageHandler { @Override public void handleMessage(Message<?> message) throws MessagingException { // 处理接收到的消息 } } ``` 在 `handleMessage` 方法中,可以获取到接收到的 MQTT 消息,然后进行处理。 总之,以上是一个简单的示例,演示了如何在 Spring Integration 中使用 MQTT 子协议实现多个主题的订阅。需要注意的是,要在 Spring 配置文件中导入 `int-mqtt` 命名空间和 `int` 命名空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值