Intereting Posts
Expandablelistview расширяет simplecursoradapter для заполнения из sqlite Студия Android не открывается в Windows Android: ScrollView vs NestedScrollView Активность меняется при изменении ориентации Сбой сборки при запуске-андроиде из-за зависимостей Как использовать LoaderManager.LoaderCallbacks и CursorLoader для ORMLite? Ошибка: NullPointerAccess: переменная «» может быть только нулевой в этом месте ОШИБКА: запрошено «ранчу» не доступно Android / FBReaderJ / gen уже существует, но не является исходной папкой. Преобразовать в исходную папку или переименовать ее Android, FAB, использующий конструкцию поддержки Android, квадрат в API ниже 21 Обнаружение устройства обнаружения не работает для DEFAULT_MEDIA_RECEIVER_APPLICATION_ID Как удалить только файл макета xml для ландшафта? Проблема с переделкой и простотой – попытка создания RSS-ридера для Android Возможно ли выполнение сборки ARM в iPhone Simulator или Android Simulator? Как сохранить вид карты внутри фрагмента?

Вызов метода в действии из класса BroadCastReceiver без создания активности

Я хочу сделать то же самое, что упоминалось в вопросе в следующей ссылке. Вызовите метод активности из класса BroadcastReceiver . Но решение, данное там, не работает для меня, и я не могу комментировать его, поскольку у меня недостаточно репутации. Я сделал все, что упоминалось в решении, но мой вещательный приемник не работает с этим кодом.

Я просто хочу вызвать метод в действии при получении запроса на широковещание без создания экземпляра действия. Это можно сделать?

EDIT: Теперь я добавляю код.

Вот мой класс MainActivity

package com.example.app1; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.widget.Toast; public class MainActivity extends Activity { public static final String TAG="App1"; private ActionReceiver receiver = null; // private YourBroadcastReceiverClassName yourBR = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // receiver= new ActionReceiver(); //IntentFilter filter = new IntentFilter(); //filter.addAction("com.example.app1.printSomething"); // printSomething(); } public void printSomething(){ Toast.makeText(this,"Hello World",Toast.LENGTH_LONG); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

Это мой класс ActionReceiver, который является BroadcastReceiver

 package com.example.app1; import android.app.IntentService; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.widget.Toast; public class ActionReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if("com.example.app1.printSomething".equalsIgnoreCase(intent.getAction())) Toast.makeText(context,"Hello World", Toast.LENGTH_LONG).show(); } } 

Это мой файл AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app1" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.app1.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=".ActionReceiver"> <intent-filter> <action android:name="com.example.app1.printSomething"/> </intent-filter> </receiver> </application> </manifest> 

Теперь я хочу вызвать printSomething() написанный в MainActivity из onReceive() в классе onReceive() . Но я не хочу запускать MainActivity для этого. Это можно сделать?

Вы можете вызвать метод внутри MainActivity, не создавая его. Вам просто нужно получить ссылку на хостинг. Сделать его статическим не обязательно:

 ((MainActivity) getActivity()).printSomething(); 

В MainActivity:

 public void printSomething() { doStuff(); } 

Если вам просто нужно выполнить метод без создания экземпляра, сделайте этот метод статическим.

Если вы не можете сделать этот метод статическим, вам нужно получить экземпляр этого действия.

РЕДАКТИРОВАТЬ:

Если вы хотите выполнить метод в экземпляре, вы должны создать этот экземпляр. Это означает, что u должен создавать и запускать деятельность. Если u хочет выполнить метод без активности, просто создайте этот метод static.

Изменить метод в активности:

 public static void printSomething(){ Toast.makeText(this,"Hello World",Toast.LENGTH_LONG); } 

А затем назовите его из своей трансляции:

 @Override public void onReceive(Context context, Intent intent) { if("com.example.app1.printSomething".equalsIgnoreCase(intent.getAction())) MainActivity.printSomething(); } 

Существует несколько возможных решений, вы можете использовать локальный широковещательный приемник для отправки сообщения в свою деятельность, в этом случае вам необходимо подписаться на вашу деятельность.

Или вы можете использовать EventBus для этого, это может быть шина событий Otto или GreenDroid … В этом случае вы бы сделали то же самое, подпишите свою активность на шину событий, но более элегантным способом 🙂

Вы можете сделать это в классе BroadcastReceiver: –

  MainActivity mainActivity; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { mainActivity= new MainActivity(); mainActivity.printSomething(); }