当你收到消息把通知栏拉下来的时候MssageActivity处于onPause的状态,当你点击通知之后回到MssageActivity从onResume开始执行(去看看activity的生命周期),而不会重新onCreate,所以执行不到你的onCreate里面的edit1setText(getIntent()getStringExtra("notify"));
你可以重写onResume方法,把edit1setText(getIntent()getStringExtra("notify"));也放到onResume里面就可以了
#使用mpvue 开发小程序过程中 简单介绍一下微信小程序蓝牙连接过程
#在蓝牙连接的过程中部分api需要加定时器延时1秒到2秒左右再执行,原因为何不知道,小程序有这样的要求
#1首先是要初始化蓝牙:openBluetoothAdapter()
```js
if (wxopenBluetoothAdapter) {
wxopenBluetoothAdapter({
success: function(res) {
/ 获取本机的蓝牙状态 /
setTimeout(() => {
getBluetoothAdapterState()
}, 1000)
},
fail: function(err) {
// 初始化失败
}
})
} else {
}
```
#2检测本机蓝牙是否可用:
# 要在上述的初始化蓝牙成功之后回调里调用
```js
getBluetoothAdapterState() {
var that= this;
thattoastTitle= '检查蓝牙状态'
wxgetBluetoothAdapterState({
success: function(res) {
startBluetoothDevicesDiscovery()
},
fail(res) {
consolelog(res)
}
})
}
```
#3 开始搜索蓝牙设备:
```js
startBluetoothDevicesDiscovery() {
var that= this;
setTimeout(() => {
wxstartBluetoothDevicesDiscovery({
success: function(res) {
/ 获取蓝牙设备列表 /
thatgetBluetoothDevices()
},
fail(res) {
}
})
}, 1000)
}
```
#4 获取搜索到的蓝牙设备列表
# / thatdeviceName 是获取到的蓝牙设备的名称, 因为蓝牙设备在安卓和苹果手机上搜到的蓝牙地址显示是不一样的,所以根据设备名称匹配蓝牙/
```js
getBluetoothDevices() {
var that= this;
setTimeout(() => {
wxgetBluetoothDevices({
services: [],
allowDuplicatesKey: false,
interval: 0,
success: function(res) {
if (resdeviceslength> 0) {
if (JSONstringify(resdevices)indexOf(thatdeviceName) !== -1) {
for (let i = 0; i < resdeviceslength; i++) {
if (thatdeviceName === resdevices[i]name) {
/ 根据指定的蓝牙设备名称匹配到deviceId /
thatdeviceId = thatdevices[i]deviceId;
setTimeout(() => {
thatconnectTO();
}, 2000);
};
};
} else {
}
} else {
}
},
fail(res) {
consolelog(res, '获取蓝牙设备列表失败=====')
}
})
}, 2000)
},
```
#5连接蓝牙
# 匹配到的蓝牙设备ID 发送连接蓝牙的请求, 连接成功之后 应该断开蓝牙搜索的api,然后去获取所连接蓝牙设备的service服务
```js
connectTO() {
wxcreateBLEConnection({
deviceId: deviceId,
success: function(res) {
thatconnectedDeviceId = deviceId;
/ 4获取连接设备的service服务 /
thatgetBLEDeviceServices();
wxstopBluetoothDevicesDiscovery({
success: function(res) {
consolelog(res, '停止搜索')
},
fail(res) {
}
})
},
fail: function(res) {
}
})
}
```
#6 获取蓝牙设备的service服务,获取的serviceId有多个要试着连接最终确定哪个是稳定版本的service 获取服务完后获取设备特征值
```js
getBLEDeviceServices() {
setTimeout(() => {
wxgetBLEDeviceServices({
deviceId: thatconnectedDeviceId,
success: function(res) {
thatservices= resservices
/ 获取连接设备的所有特征值 /
thatgetBLEDeviceCharacteristics()
},
fail: (res) => {
}
})
}, 2000)
},
```
#7获取蓝牙设备特征值
# 获取到的特征值有多个,最后要用的事能读,能写,能监听的那个值的uuid作为特征值id,
```js
getBLEDeviceCharacteristics() {
setTimeout(() => {
wxgetBLEDeviceCharacteristics({
deviceId: connectedDeviceId,
serviceId: services[2]uuid,
success: function(res) {
for (var i = 0; i < rescharacteristicslength; i++) {
if ((rescharacteristics[i]propertiesnotify || rescharacteristics[i]propertiesindicate) &&
(rescharacteristics[i]propertiesread && rescharacteristics[i]propertieswrite)) {
consolelog(rescharacteristics[i]uuid, '蓝牙特征值 ==========')
/ 获取蓝牙特征值 /
thatnotifyCharacteristicsId = rescharacteristics[i]uuid
// 启用低功耗蓝牙设备特征值变化时的 notify 功能
thatnotifyBLECharacteristicValueChange()
}
}
},
fail: function(res) {
}
})
}, 1000)
},
```
#8启动notify 蓝牙监听功能 然后使用 wxonBLECharacteristicValueChange用来监听蓝牙设备传递数据
#接收到的数据和发送的数据必须是二级制数据, 页面展示的时候需要进行转换
```js
notifyBLECharacteristicValueChange() { // 启用低功耗蓝牙设备特征值变化时的 notify 功能
var that= this;
consolelog('6启用低功耗蓝牙设备特征值变化时的 notify 功能')
wxnotifyBLECharacteristicValueChange({
state: true,
deviceId: thatconnectedDeviceId,
serviceId: thatnotifyServicweId,
characteristicId: thatnotifyCharacteristicsId,
complete(res) {
/用来监听手机蓝牙设备的数据变化/
wxonBLECharacteristicValueChange(function(res) {
//
thatbalanceData += thatbuf2string(resvalue)
thathexstr += thatreceiveData(resvalue)
})
},
fail(res) {
consolelog(res, '启用低功耗蓝牙设备监听失败')
thatmeasuringTip(res)
}
})
},
/转换成需要的格式/
buf2string(buffer) {
var arr = Arrayprototypemapcall(new Uint8Array(buffer), x => x)
return arrmap((char, i) => {
return StringfromCharCode(char);
})join('');
},
receiveData(buf) {
return thishexCharCodeToStr(thisab2hex(buf))
},
/转成二进制/
ab2hex (buffer) {
var hexArr = Arrayprototypemapcall(
new Uint8Array(buffer), function (bit) {
return ('00' + bittoString(16))slice(-2)
}
)
return hexArrjoin('')
},
/转成可展会的文字/
hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStrtrim();
var rawStr = trimedStrsubstr(0, 2)toLowerCase() === '0x' trimedStrsubstr(2) : trimedStr;
var len = rawStrlength;
var curCharCode;
var resultStr= [];
for (var i = 0; i < len; i = i+ 2) {
curCharCode = parseInt(rawStrsubstr(i, 2), 16);
resultStrpush(StringfromCharCode(curCharCode));
}
return resultStrjoin('');
},
```
# 向蓝牙设备发送数据
```js
sendData(str) {
let that= this;
let dataBuffer = new ArrayBuffer(strlength)
let dataView = new DataView(dataBuffer)
for (var i = 0; i < strlength; i++) {
dataViewsetUint8(i, strcharAt(i)charCodeAt())
}
let dataHex = thatab2hex(dataBuffer);
thiswriteDatas = thathexCharCodeToStr(dataHex);
wxwriteBLECharacteristicValue({
deviceId: thatconnectedDeviceId,
serviceId: thatnotifyServicweId,
characteristicId: thatnotifyCharacteristicsId,
value: dataBuffer,
success: function (res) {
consolelog('发送的数据:' + thatwriteDatas)
consolelog('message发送成功')
},
fail: function (res) {
},
complete: function (res) {
}
})
},
```
# 当不需要连接蓝牙了后就要关闭蓝牙,并关闭蓝牙模块
```js
// 断开设备连接
closeConnect() {
if (thatconnectedDeviceId) {
wxcloseBLEConnection({
deviceId: thatconnectedDeviceId,
success: function(res) {
thatcloseBluetoothAdapter()
},
fail(res) {
}
})
} else {
thatcloseBluetoothAdapter()
}
},
// 关闭蓝牙模块
closeBluetoothAdapter() {
wxcloseBluetoothAdapter({
success: function(res) {
},
fail: function(err) {
}
})
},
```
#在向蓝牙设备传递数据和接收数据的过程中,并未使用到read的API 不知道有没有潜在的问题,目前线上运行为发现任何的问题
#今天的蓝牙使用心得到此结束,谢谢
windows7d出notify记事本处理方法如下:
1、在运行里面输入MSConfig。
2、切换到启动项里。
3、将记事本程序前的勾去掉。
4、重启系统即可。Windows7是由微软公司开发的,具有革命性变化的 *** 作系统。
synchronized 就是多线程去访问这个地方的时候,只能一个一个的访问
wait 就是说,当线程进入synchronized 的时候,如果调用了wait那么线程就会休眠,即程序执行到wait 那个地方后就停下来了
你必须要调用notify 或者是notifyAll后,才会继续执行
Thread t1先执行调用cmanufacture();打印"制造一台电脑" t1等待被t2唤醒wait();
Thread t2执行时调用ctransport();但是没有打印"运走一台电脑"因为"运走一台电脑"没有在ctransport();中wait()前打印,而是在ctransport();调用后打印的,所以这里没有输出
t2执行唤醒t1 notify();t2等待被t1唤醒wait();注意这时ctransport();并没有执行完,它还在等待被t1唤醒
Thread t1再执行调用cmanufacture();打印"制造一台电脑" 唤醒t2 notify();这时ctransport();执行完了打印"运走一台电脑"然后t1等待被唤醒wait();
Thread t2执行时调用ctransport();但是没有打印"运走一台电脑"唤醒t1 notify();t2 wait();注意这时ctransport();并没有执行完,它还在等待被t1唤醒
Thread t1执行调用cmanufacture();打印"制造一台电脑" 唤醒t2 notify();这时ctransport();执行完了打印"运走一台电脑"然后t1等待被唤醒wait();
上面是造成"制造一台电脑"在开头被打印两次的原因
解决办法就是把打印"运走一台电脑"放到ctransport();函数中wait();语句前,就不会出现打印两次的情况了
像这样:完整的程序如下:
package exercise2;class Computer {
private int mfg=1;
int stack=0;
public synchronized void manufacture(){
try {
Threadsleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1printStackTrace();
}
Systemoutprintln("制造一台电脑");
mfg=1;
notify();
if(mfg==1){
try{
wait();
}catch(InterruptedException e){
eprintStackTrace();
}
}
}
public synchronized void transport(){
try {
Threadsleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1printStackTrace();
}
Systemoutprintln("运走一台电脑");//这里加上打印语句
stack+=1;
mfg=0;
notify();
if(mfg==0){
try{
wait();
}catch(InterruptedException e){
eprintStackTrace();
}
}
}
}
class producer implements Runnable{
Computer c=null;
public producer(Computer c) {
thisc = c;
}
@Override
public void run() {
while(true){
cmanufacture();
}
}
}
class Consumer implements Runnable{
Computer c=null;
public Consumer(Computer c) {
thisc = c;
}
@Override
public void run() {
while(true){
ctransport();
//Systemoutprintln("运走一台电脑");//这里去掉打印语句 移动到ctransport();函数中wait语句前
}
}
}
public class Ex22_2 {
public static void main(String[] args) {
Computer c=new Computer();
Thread t1=new Thread(new producer(c));
Thread t2=new Thread(new Consumer(c));
t1start();
t2start();
try {
Threadsleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
t1stop();
t2stop();
Systemoutprintln(cstack);
}
}
运行结果:
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
14
所有JavalangObject的子类都从Object类继续了3个wait和1个notity()及1个notifyAll()方法。具体的区别看相关的API。有时或者你还想使用sleep方法,notify方法的调用,会使当前线程进行阻塞状态,三个notify的区别,有的是直接加入到阻塞队列中,有的是阻塞一定的时间,但是不论哪种,没有本质区别,因为一旦加入到了阻塞队列,线程的优先级并不会改变,也就是说,只要你不去调用唤醒,注意是唤醒进程的notify()或者notifyAll()方法,线程会一直阻塞,除非你调用了,线程才会从阻塞状态变成可运行状态(runnable),注意是 可运行,并不是说立即马上就会执行,对于处于可运行状态的多个线程来说,由JVM根据当前线程池当中的可运行状态的线程的优先级来决定,Java中的线程执行是完成根据优先级抢占式执行的,也就是说,高优先级的线程会首先获得执行,当然正在运行的线程也会被比他高的线程把中断,至于中断的具体细节需要你写相关的代码测试,JVM实现这个功能的代码是不开源的。可能最让人迷惑的就是同优先级,或者默认优先级线程的执行顺序,我来告诉你,同优先级的顺序在JVM规范里是这么讲的:同优先级的线程的执行顺序是不确定的,JVM本身不支持多线程,JDK15时,当前1624的版本不太清楚,除非当前JVM所在的 *** 作系统支持多线程,就像现在的多核系统,JVM有可能会支持多线程的处理,注意JVM不具有跨平台性。。。,所以在多核下的多线程是一个非常值得测试的东西。除非当前的 *** 作系统技术多线程,JVM才有可能支持多线程的处理,注意是有可能。并且JVM规范里说了,Java下所有在线程上的 *** 作,程序的正确性永远不要依赖于线程的优先级。也就是说不要希望通过修改线程的优先级来决定程序执行顺序的正确性。解决这个问题最好的办法,我用的还是同步和互斥。通过他来共享 *** 作。主要原因还是只有一个,同优先级线程并发执行是完全不可猜测的。完全随机,因素包括当前JVM的状态,可以这么想象一下,如果当前有多个线程需要执行,在JVM有限的资源上,不同的线程所要的资源和使用这些资源的时间是不同的,这也就决定了,在JVM的设计上,会根据一定的算法,来决定这些线程执行的顺序,否则同时装载几个需要大量资源的线程将导致JVM崩溃等等,其实是没有太大意义的,也顶多只是让当前线程进行可执行状态,进行等待队列,等待执行罢了。 希望你能明白。好长时间不看书,完全是看到这个问题,想起来的,可能有点乱。如果想再深入明白,包括线程具体是怎么实现的,可以找JVM规范相关的书看看。 对线程最好的学习,就是写程序测试线程,多设断点 ,来跟踪,通过每次执行的不同的可能的结果来经验化的学习。 最后说一句:notify() notifiAll()只会让线程从阻塞状态变成可执行状态,runnable 到 run状态,状态的变化是由JVM来完成。换句话说,就是程序里的run()方法的调用。 这种随机执行其实完全是因为特定的算法,和当前JVM的运行状态。换句话说,其实并不是真的随机。
以上就是关于android NotificationManager 和Notification的使用问题;多调消息,点击后到MessageActivity消息不更新全部的内容,包括:android NotificationManager 和Notification的使用问题;多调消息,点击后到MessageActivity消息不更新、微信小程序蓝牙教程--完整版亲测、windows7d出notify记事本怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)