|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Дня доброго. Есть у меня приложение на Android В нем есть java-класс, наследник Runnable, который принимает в себя, при создании параметр String. Создается этот java -класс из NDK либы. Вызывается через JNI. Классик. Далее, на основании этого параметра создается Intent и регистрируется broadcastReceiver. И все. Никаких сообщений он не перехватывает. Однако, если туже строку задать в коде java-класса константой, тоесть: FilterName="android.intent.action.BATTERY_CHANGED"; то все работает как часы. Строки - идентичны, побайтово проверял. Единственное отличие - в отладчике, когда проваливаешься в класс String, для строки, заданной константой через код, поле Offset имеет гигантское значение, а для строки, пришедшей из NDK - Offset=0. Ну, и, если смотреть на поле value, то в константной переменной там просто тьма текста, начинающегося с "precision" Что я не понимаю? Почему эти строки такие разные, хотя их байтовая начинка одинаковая. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 14:25 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
На правах идеи/бреда: 1) Можно из этой строки создать новую и ее использовать. (на Java стороне) 2) Можно для строки попытаться сделать https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern-- и пользоваться интернированной строчкой. Теоретически, интернированные строки должны быть похожи на константы из кода (или на Java или на JNI стороне) broadcastReceiver - я даже такого слова не слышал ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 14:32 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Ежов Дмитрий Сергеевич, а вместо броадкастресивера пробовала бэттериресивер зарегить ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 14:50 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Озверин, я события от батареи ловлю как наиболее удобно воспроизводимые в эмуляторе. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 14:51 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Ежов Дмитрий Сергеевич, хз..по offset`у - абсолютно все равно, какой он. Сделано для того, чтобы можно было , к примеру, при операции выделения подстроки не создавать "новый" объект, а ссылаться на старый с нужным смещением. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 14:55 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Ничего не понимаю. Есть пустое приложение. В нем есть класс ScanCode - наследник от Runnable. В этом классе есть класс TScanCodeReceiver - наследник от BroadcastReceiver. И сообщения не перехватываются. package com.example.myapplication; import android.arch.lifecycle.ViewModelProvider; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("CATCH", "onReceive: CATCH"); } } class ScanCode implements Runnable { private Activity m_Activity; private TScanCodeReceiver m_ScanCodeReceiver; private String FilterName; class TScanCodeReceiver extends BroadcastReceiver { @Override public void onReceive(android.content.Context curContext, android.content.Intent curIntent) { if (curIntent.getAction() == FilterName) { Log.i("CATCH!", "onReceive: CATCH!"); } } } public ScanCode(Activity activity) { this.m_Activity = activity; } public void run() { } public void show() { this.m_Activity.runOnUiThread(this); } public void setFilterName(String name) { this.FilterName = name; } public void start() { this.m_ScanCodeReceiver = new TScanCodeReceiver(); IntentFilter filter = new IntentFilter(this.FilterName); this.m_Activity.registerReceiver(this.m_ScanCodeReceiver, filter); } public void stop() { if (this.m_ScanCodeReceiver != null) { this.m_Activity.unregisterReceiver(m_ScanCodeReceiver); this.m_ScanCodeReceiver = null; } } } public class MainActivity extends AppCompatActivity { ScanCode sc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sc = new ScanCode(this); sc.run(); sc.show(); sc.setFilterName("android.intent.action.BATTERY_CHANGED"); sc.start(); } }; ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 16:03 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Но если я поменяю и вместо использования TScanCodeReceiver буду использовать внешний класс MyBroadcastReceiver - то сообщения будут перехватываться. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 16:05 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Ежов Дмитрий Сергеевич, так утебя в одном случае есть проверка на имя события, а во втором - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 16:14 |
|
Проблема с 0-offset строками
|
|||
---|---|---|---|
#18+
Озверин, блин, слона то я и не приметил. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2019, 16:31 |
|
|
start [/forum/topic.php?fid=59&msg=39784496&tid=2121443]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 325ms |
total: | 469ms |
0 / 0 |