![](/img/trans.png)
[英]How can I verify that the onReceive method of a Broadcast Receiver from a different App is actually called?
[英]How to get access to the MainActivity findViewById from inside a Broadcast Receiver onReceive method?
當我使用此代碼時:
@Override
public void onReceive(Context context, Intent intent) {
seconds += 0.1;
if (seconds > 59.9) {
seconds=0;
minutes++;
}
TextView tv = (TextView)((MainActivity)context).findViewById(R.id.txtChron);
tv.setText (String.valueOf(minutes) + ":" + String.valueOf(seconds));
}
嘗試將上下文MainActivity
為MainActivity
時出現錯誤。
這是錯誤/堆棧跟蹤:
E / AndroidRuntime:致命例外:main進程:com.example.jordanbleu.lab8chronservjordanble,PID:22693 java.lang.RuntimeException:在com中接收廣播Intent {act = com.example.jordanbleu.lab8chronservjordanbleu.MY_TIME_TICK flg = 0x10}時出錯。 example.jordanbleu.lab8chronservjordanbleu.ChronometerReceiver@d9365fe在android.app.LoadedApk $ ReceiverDispatcher $ Args.run(LoadedApk.java:1132)在android.os.Handler.handleCallback(Handler.java:751)在android.os.Handler。 android.os.Looper.loop(Looper.java:154)的dispatchMessage(Handler.java:95)java.lang.reflect.Method.invoke(Native)的android.app.ActivityThread.main(ActivityThread.java:6119) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)處的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)處的原因:java.lang.ClassCastException :無法將android.app.Application強制轉換為com.example.jordanbleu.lab8chronservjordanbleu.MainActivity的com.example.jordanbleu.lab8chronservjordanble u.ChronometerReceiver.onReceive(ChronometerReceiver.java:41)在android.app.LoadedApk $ ReceiverDispatcher $ Args.run(LoadedApk.java:1122)在android.os.Handler.handleCallback(Handler.java:751)在android.os在java.lang.reflect.Method上的.Handler.dispatchMessage(Handler.java:95)在android.os.Looper.loop(Looper.java:154)在android.app.ActivityThread.main(ActivityThread.java:6119)處。在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)處com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)處調用(本機方法)
因此,我有一個MainActivity
,它可以啟動服務。 服務創建一個新線程,並且該線程不斷創建隱式意圖,這些隱式意圖由BroadcastReceiver
處理。 此廣播接收器將更新時鍾,並使用更新的時間更新布局中的TextView
。 但是,當我嘗試通過context參數訪問findViewByID
,出現了以上錯誤。
在Activity
的onCreate
函數中初始化TextView
。
TextView tv = (TextView) findViewById(R.id.txtChron);
然后在您的onReceive
函數中
@Override
public void onReceive(Context context, Intent intent) {
seconds += 0.1;
if (seconds > 59.9) {
seconds=0;
minutes++;
}
tv.setText(String.valueOf(minutes) + ":" + String.valueOf(seconds));
}
您的錯誤是:
java.lang.ClassCastException:android.app.Application無法轉換為com.example.jordanbleu.lab8chronservjordanbleu.MainActivity
這意味着“上下文上下文”是Application,而不是MainActivity。
我的建議是,在OnCreate中膨脹TextView。
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
tv = (TextView) findViewById(R.id.txtChron); // This!
...
}
@Override
public void onReceive(Context context, Intent intent) {
seconds += 0.1;
if (seconds > 59.9) {
seconds=0;
minutes++;
}
tv.setText (String.valueOf(minutes) + ":" + String.valueOf(seconds));
}
您也可以使用界面。 這樣,您將不必訪問BroadcastReceiver中的UI元素。
1)創建一個接口:
interface ReceiverListener {
public void doSomething(String arg1, String arg2);
}
2)在您的BroadcastReceiver中實例化監聽器
public class YourBroadCastReceiver extends BroadCastReceiver{
private ReceiverListener listener;
@Override
public void onReceive(Context context, Intent intent) {
listener = (ReceiverListener)context; // Initialize listener
// Your logic
String minutes = //get it
String seconds = // get it
listener.doSomething(minutes,seconds);
}
}
3)在“您的活動”中實現接口並覆蓋方法
public YourActivity extends AppcompatActivity implements ReceiverListener{
// Activity related code
TextView tv;
public void updateUI(String minutes,String seconds){
tv.setText (minutes + ":" + seconds);
}
@Override
public void doSomething(String arg1, String arg2){
updateUI(arg1,arg2);
}
}
如果您想了解在這種情況下使用接口的優勢,請閱讀此內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.