Android笔记(二十六) Android中的广播——BroadcastReceiver
为了方便进行系统级别的消息通知,Android有一套类似广播的消息机制,每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能是来自于系统,也可能是来自于其他程序。
先区分两个概念:广播和广播接收器
广播是由系统或者程序发出,广播中包含某些数据或者信息。
广播接收器是一个继承了BroadcastReceiver的类,用来接收广播并做出相应响应或处理。
广播可以分为两种类型:有序广播、有序广播
标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因为它们之间没有任何先后顺序可言,这种广播的效率会比较高,但同时也意味着它是无法被截断的

如上图所示,每个人都代表一个广播接收器,在广播发出之后,每个人(广播接收器)都会接收到这条广播
有序广播是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。所以有序广播是有先后顺序的,优先级高的广播接收器可以先接受到广播消息,并且还可以阻断正在传递的广播,如果截断,后面的接收器就无法收到了

总结一下普通广播和有序广播的特点:
普通广播:
使用sendBroadcast()发送广播
同级别的广播接收器接收先后顺序是随机的
不同级别的广播接收器,级别低的后收到广播
接收器不能阻断广播,也不能处理广播
同级别的广播接收器,动态注册优先级高于静态注册
有序广播:
使用sendOrderedBroadcast()发送广播
同级别的广播接收器顺序是随机的(级别越高,越先收到)
能阻断广播,也能处理广播
同级别的广播接收器,动态注册优先级高于静态注册
一个简单的示例演示一下:
看代码
package cn.lixyz.broadcasttest; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
sendBroadcast(intent);
break;
case R.id.button2: break;
}
}
}
MainActivity.java
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MyFirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST","MyFirstReceiver广播接收器接收到了广播");
}
}
MyFirstReceiver.java
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了");
}
}
MySecondReceiver.java
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity"> <EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入您要广播的消息" /> <!-- 设置一个发送普通广播的按钮 -->
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送普通广播" /> <!-- 设置一个发送有序广播的按钮 -->
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送有序广播" /> </LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"> <activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
</application>
</manifest>
AndroidManiFest.xml
运行结果
点击“发送普通广播按钮”,有如下Log:

可以看到两个接收器都已经接收到了广播,这里显示的是MyFirstReceiver先接收到,但其实是随机的。
现在我们修改一下两个接收器的优先级,修改AndroidManiFest.xml文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"> <activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".MyFirstReceiver">
<intent-filter android:priority="200">
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter android:priority="300">
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
</application>
</manifest>
AndroidManiFest.xml
这时候再看运行结果:

会发现MySecondReceiver首先接收到,所以同级别的广播接收器接收先后顺序是随机的而不同级别的广播接收器,级别低的后收到广播
我们再尝试阻断一下广播,使用abortBroadcast()方法来阻断广播:
修改MySecondReceiver.java
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了");
abortBroadcast();
}
}
MySecondReceiver.java
运行结果:

可见,并没有阻断成功,所以普通广播不能阻断广播
接下来我们修改一下两个接收器的注册方式:
将MySecondReceiver改为动态注册
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了");
abortBroadcast();
}
}
MySecondReceiver.java
package cn.lixyz.broadcasttest; import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); intentFilter = new IntentFilter("cn.lixyz.broadcasttest.MainActivity");
mySecondReceiver = new MySecondReceiver();
registerReceiver(mySecondReceiver, intentFilter); } @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mySecondReceiver);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2: break;
}
}
}
MainActivity.java
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"> <activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
</application>
</manifest>
AndroidManiFest.xml
运行结果为:

可见:普通广播中同级别的广播接收器,动态注册优先级高于静态注册。
注意:动态注册的广播接收器,一定要记得取消注册,一般在onDestroy()方法中调用unregisterReceiver(Receiver)来取消注册。
看一下有序广播,修改代码:
package cn.lixyz.broadcasttest; import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
sendOrderedBroadcast(intent2, null);
break;
}
}
}
MainActivity.java
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"> <activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
</application>
</manifest>
AndroidManiFest.xml
将两个广播接收器都设置为静态注册,并且没有设置优先级,默认两个优先级相同,运行结果为:

虽然运行结果是MyFirstReceiver先执行,但实际上有序广播对于优先级相同的接收器也是随机随机的。
我们将MySecondReceiver修改为动态注册
package cn.lixyz.broadcasttest; import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mySecondReceiver = new MySecondReceiver();
intentFilter = new IntentFilter("cn.lixyz.broadcasttest.MainActivity");
registerReceiver(mySecondReceiver, intentFilter); } @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mySecondReceiver);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
sendOrderedBroadcast(intent2, null);
break;
}
}
}
MainActivity.java
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"> <activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
</application>
</manifest>
AndroidManiFest.xml
点击“发送有序广播”按钮,运行结果为:

可见,有序广播下,相同优先级的广播接收器,动态注册的要优先于静态注册。
将两个接收器全部设置为静态注册,并设置优先级
package cn.lixyz.broadcasttest; import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
sendOrderedBroadcast(intent2, null);
break;
}
}
}
MainActivity.java
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"> <activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".MyFirstReceiver">
<intent-filter android:priority="100">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter android:priority="200">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver> <receiver android:name=".MyThirdReceiver">
<intent-filter android:priority="300">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter> </receiver>
</application>
</manifest>
AndroidManiFest.xml
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/12.
*/
public class MyThirdReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MyThirdReceiver广播接收器接收到广播了");
}
}
MyThirdReceiver.java
运行结果

可见,有序广播同样优先级越高,越先接收到消息
再修改一下MyThirdReceiver.java
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/12.
*/
public class MyThirdReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MyThirdReceiver广播接收器接收到广播了");
abortBroadcast();
}
}
MyThirdReceiver.java
点击多次按钮,运行结果为:

可见有序广播是可以阻断广播的
下面演示一下有序广播的值传递
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"> <activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver android:name=".MyFirstReceiver">
<intent-filter android:priority="300">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter android:priority="200">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver> <receiver android:name=".MyThirdReceiver">
<intent-filter android:priority="100">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter> </receiver>
</application>
</manifest>
AndroidManifest.xml
package cn.lixyz.broadcasttest; import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
editText = (EditText) findViewById(R.id.editText);
String str = editText.getText().toString();
intent2.putExtra("data", str);
sendOrderedBroadcast(intent2, null);
break;
}
}
}
MainActivity
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MyFirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MyFirstReceiver广播接收器接收到了广播,广播内容是:" + intent.getStringExtra("data"));
}
}
MyFirstReceiver.java
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了,广播内容是:" + intent.getStringExtra("data"));
String str = "MySecondReceiver新增内容";
Bundle bundle = getResultExtras(true);
bundle.putString("data", intent.getStringExtra("data"));
bundle.putString("data2", str);
setResultExtras(bundle); }
}
MySecondReceiver.java
package cn.lixyz.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log; /**
* Created by LGB on 2015/9/12.
*/
public class MyThirdReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = getResultExtras(true);
String data = bundle.getString("data");
String data2 = bundle.getString("data2");
Log.d("TEST", "MyThirdReceiver广播接收器接收到广播了,广播内容是:" + data + data2);
}
}
MyThirdReceiver.java
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity"> <EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入您要广播的消息" /> <!-- 设置一个发送普通广播的按钮 -->
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送普通广播" /> <!-- 设置一个发送有序广播的按钮 -->
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送有序广播" /> </LinearLayout>
activity_main.xml
运行结果为:


Android笔记(二十六) Android中的广播——BroadcastReceiver的更多相关文章
- Android笔记二十四.Android基于回调的事件处理机制
假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- Android之旅十六 android中各种资源的使用
android中各种资源的使用: 在android开发中,各种资源的合理使用应该在各自的xml中进行定义,以便反复使用; 字符串资源:strings.xml,xml中引用:@string/XXX,ja ...
- Android笔记(七十六) 点菜DEMO
一个朋友让看一下他的代码,一个点菜的功能,他和我一样,初学者,代码比我的都混乱,也是醉了,干脆想着自己写个demo给他看,原本想着听简单,半个小时应该就可以搞定,真正写的时候,画了3h+,汗颜... ...
- Android笔记(七十五) Android中的图片压缩
这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...
- Android笔记(十) Android中的布局——表格布局
TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...
- Android笔记(十六) 简易计算器
实现功能: 简单计算器 布局及美化 采用LinearLayout嵌套LinearLayout实现布局. 要求 1. 按钮所有文字居于右下角 2. 按钮为白色,点击变成橘色 3. 显示屏文字居右显示并且 ...
- Android核心分析之二十六Android GDI之SurfaceFlinger
Android GDI之SurfaceFlinger SurfaceFinger按英文翻译过来就是Surface投递者.SufaceFlinger的构成并不是太复杂,复杂的是他的客户端建构.Sufac ...
- Android进阶(二十六)MenuInflater实现菜单添加
MenuInflater实现菜单添加 前言 之前实现的Android项目中可以实现菜单的显示.但是再次调试项目时发现此功能已无法实现,很是令人费解.难道是因为自己手机Android系统的问题?尝试通过 ...
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
随机推荐
- time zone list
GMT UTC WET WET CET CET MET CET ECT CET EET EET MIT Pacific/Apia HST Pacific/Honolulu AST America/An ...
- Spring Cloud API网关服务 5.2
为什么需要API网关 通过前面内容的学习,我们已经可以构建一个简单的微服务架构系统.这个系统可以使用Spring Boot实现微服务的开发,使用Spring Cloud Eureka实现注册中心以及服 ...
- Linux查找含有特定字符串的文件
Linux查找含有特定字符串的文件命令为grep.以下为详细的使用方法 grep [OPTIONS] PATTERN [FILE...] #实例:递归查找当前文件夹下所有含有test的文件,并显示行号 ...
- 【tensorflow】softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits
softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits都是对最后的预测结果进行softmax然后求交叉熵 ...
- C++ 宏和模板简介
参考<21天学通C++>第14章节,对C++中的宏和模板进行了学习,总结起来其主要内容如下: (1) 预处理器简介 (2) 关键字#define与宏 (3) 模板简介 (4) 如何编写函数 ...
- 在Jetty中部署Jenkins遇到的问题
1. Jetty 9.0.3 启动时的错误: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@kvm-guest jetty-9.0.3]# java -jar star ...
- P1993 小K的农场(差分约束)
小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了 ...
- synchrnized 和lock的区别
- LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
104. 二叉树的最大深度 104. Maximum Depth of Binary Tree 题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说 ...
- [转帖]Apache Kylin 概述
Apache Kylin 概述 https://www.cnblogs.com/xiaodf/p/11671095.html 1 Kylin是什么 今天,随着移动互联网.物联网.AI等技术的快速兴起, ...