2013-11-11 2 views
-1

Edit 1NullPointerException при вызове метода от BroadcastReceiver к активности?

Мне нужно вызвать метод из BroadcastReceiver и методы существует в деятельности класса упоминании ниже.

Я пробовал этот код и получил NULL_POINTER_EXCEPTION, где создаю ссылку на класс MainActivity.

Исправить меня, что я делаю неправильно?

MainActivity.java

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void myTesting(){ 
    Toast.makeText(MainActivity.this, "Welcome to Activity", Toast.LENGTH_SHORT).show(); 
} 
} 

BroadcastReceiver.java

public class BootCompeteReceiver extends BroadcastReceiver { 

public Context mContext; 
private MainActivity mainActivity; 

@Override 
public void onReceive(Context context, Intent intent) { 
    mContext = context; 

    try { 
     mainActivity = new MainActivity(); 
     mainActivity.myTesting(); 

    } catch (Exception e) { 
     Toast.makeText(context, ""+e, Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } 
} 
+0

активность не является хорошим местом, чтобы написать метод, который вы собираетесь звонить из других ресурсов. Поэтому переместите метод 'myTesting' в некоторые классы uitility. –

+0

и создание экземпляра класса активности не является хорошим, поскольку активность имеет свой lifycycle и запускается startActivity (намерением) – Raghunandan

+4

**" mainActivity = new MainActivity(); "* * Вы не можете создать экземпляр класса 'Activity', используя' new'. Это просто не сработает. – Squonk

ответ

0

ли что-то подобное:

public class MainActivity extends Activity { 

private BroadcastReceiver receiver = new BroadcastReceiver { 


@Override 
public void onReceive(Context context, Intent intent) { 

try { 

    MainActivity.this.myTesting(); 

} catch (Exception e) { 
    Toast.makeText(MainActivity.this, ""+e, Toast.LENGTH_LONG).show(); 
    e.printStackTrace(); 
} 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    IntentFilter intFilt = new IntentFilter(Constants.YOUR_BROADCAST_RECEIVER_ACTION); 
    registerReceiver(receiver, intFilt); 

} 

public void myTesting(){ 
    Toast.makeText(MainActivity.this, "Welcome to Activity", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(receiver); 

} 
} 
+0

Итак, что собирается запустить Activity, чтобы он мог создавать и регистрировать BroadcastReceiver? Насколько я могу узнать из имени класса приемника, OP прослушивает ACTION_BOOT_COMPLETED. – Squonk

0

Вы можете startActivity в onReceive и позвоните по номеру myTesting в onCreate вашей деятельности.

+0

Позвольте мне назвать то, что я упоминаю в примере? –

0

Вы можете попробовать это:

public class MainActivity extends Activity { 

    private static volatile int INSTANCE_COUNTER = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     INSTANCE_COUNTER++; 

     IntentFilter intentFilter = new IntentFilter("com.your.package.ACTION"); 
     registerReceiver(mWhateverReceiver, intentFilter); 

     if (getIntent().getBooleanExtra("fromYourReceiver", false)) { 
      myTesting(); 
     } 
    } 

    private void myTesting() { 
     // Do something here 
    } 

    private BroadcastReceiver mWhateverReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      myTesting(); 
     } 
    }; 

    public static boolean isInstanceExist() { 
     return INSTANCE_COUNTER > 0; 
    } 

    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 

     INSTANCE_COUNTER--; 
     unregisterReceiver(mWhateverReceiver); 
    } 
} 

Ваш приемник

public class BootCompeteReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (MainActivity.isInstanceExist()) { 
      // There is already one instance of MainActivity, so broadcast this 
      // event to trigger the receiver inside MainActivity to do your task 
      Intent broadcastIntent = new Intent("com.your.package.ACTION"); 
      context.sendBroadcast(broadcastIntent); 
     } else { 
      // There is no instances of MainActivity exist, so start a new one 
      // with the action that let the instance know what it should do 
      Intent activityIntent = new Intent(context, MainActivity.class); 
      activityIntent.putExtra("fromYourReceiver", true); 
      activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(activityIntent); 
     } 
    } 
} 
Смежные вопросы