2013-10-10 5 views
4

Я хочу сделать то же самое, что упоминалось в вопросе по следующей ссылке Call an activity method from a BroadcastReceiver class. Но решение, данное там, не работает для меня, и я не могу комментировать его, поскольку у меня недостаточно репутации. Я сделал все, что упоминалось в решении, но мой широковещательный приемник не работает с этим кодом.Вызов метода в действии из класса 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() в категории: ActionReceiver класс. Но я не хочу запускать для этого MainActivity. Это можно сделать?

+0

Привет @ Kiran ... Даже я пытаюсь включить/отключить кнопку MainActivity от широковещательного приемника ... Ваш вопрос - это то, что связано с этим. Вы нашли какое-то решение для этого. Если да, любезно поделитесь им ... – Prabs

+1

Привет @PrathibhaKirthi Я сделал это в твердом переплете. Я зарегистрировал широковещательный приемник для mainactivity, и я использую это для вызова метода. – Kiran

+0

Я сделал то же самое @ KIran..Its working .. :) – Prabs

ответ

0

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

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

EDIT:

если и хотят, чтобы выполнить метод в случае, вы должны создать этот экземпляр. это означает, что 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(); 
    } 
+0

EEven Я попытался сделать экземпляр этой активности, вызвав '(new MainActivity()). ThatMethod()' Но это не работает ... – Kiran

+0

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

+0

Привет, я прикрепил свой код к своему сообщению. Вы можете мне помочь? – Kiran

1

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

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

в MainActivity:

public void printSomething() { 
     doStuff(); 
} 
+0

Я запускаю это из фрагмента, который размещается в MainActivity. Я не уверен на 100%, если он работает с приемником. – bofredo

+0

Привет, когда я попытался выполнить указанную выше строку в методе 'OnReceive()' BroadcastReceiver', он дает ошибку, говорящую, что не может найти метод символа 'getActivity()'. Можете ли вы рассказать мне, что мне не хватает? – Kiran

+0

вы должны получить контекст активности. Я думал, что это getActivity(). Я искал его, вам нужен context.printSomething(). Я изменю свой ответ – bofredo

-3

Вы можете сделать это, как это в классе 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(); 



    } 
+1

, это не дойдет до текущей активности, но создаст пустой экземпляр класса Activity, но не тот, который мы хотим - который находится на экране – zaxy78

0

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

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

Смежные вопросы