2016-04-23 10 views
0

MainActivityにあるnotify()メソッドを別のクラスから呼び出す必要があります。Android以外からの通知

public class MyAlarmService extends Service{ 
    @Override 
    public IBinder onBind(Intent arg0) 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() 
    { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
    } 

    @SuppressWarnings("static-access") 
    @Override 
    public void onStart(Intent intent, int startId) 
    { 
     super.onStart(intent, startId); 

     String title = "title"; 
     String message = "message"; 

     new MainActivity().Notify(title, message); 
... 

MainActivity:これは私がそれをやった方法です

public class MainActivity extends Activity { 
    NotificationManager manager; 
    Notification myNotication; 

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 
     manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

... 
public void Notify(String notificationTitle, String notificationMessage){ 
     Intent intent = new Intent("com.xxxx.app.MainActivity"); 

     PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 1, intent, 0); 

     Notification.Builder builder = new Notification.Builder(MainActivity.this); 

     builder.setAutoCancel(false); 
     builder.setTicker("this is ticker text"); 
     builder.setContentTitle("Notification"); 
     builder.setContentText("Text"); 
     builder.setSmallIcon(R.drawable.infoicon); 
     builder.setContentIntent(pendingIntent); 
     builder.setOngoing(true); 
     builder.setSubText("This is subtext..."); 
     builder.setNumber(100); 
     builder.build(); 
     myNotication = builder.getNotification(); 
     manager.notify(11, myNotication); 
    } 

... 

しかし、私はエラーメッセージを取得:

致命的な例外をメイン プロセス:com.xxxx.app、PID: 10311 java.lang.RuntimeException:インテント{cmp = com.xxxx.app/.MyAlarmService}で[email protected]サービスを開始できません:java.lang.NullPointerException:nullオブジェクト参照で仮想メソッド 'java.lang.String android.content.Context.getPackageName()'を呼び出そうとしました。android.appでandroid.app.ActivityThread.handleServiceArgs(ActivityThread.java:3027) android.appに を呼び出しようとしています。 ActivityThread.-wrap17(ActivityThread.java)android.os.ActivityThreadの $ H.handleMessage(ActivityThread.java:1442) (android.os.Handler.dispatchMessage(Handler.java:102)) android.os.Looper .loop(Looper.java:148) android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:java.lang。 NullPointerException:nullオブジェクトリファレンスで仮想メソッド 'java.lang.String android.content.Context.getPackageName()'を呼び出そうとしました。 android.content.ContextWrapper.getPackageName(ContextWrapper.java:133) at android。 app.PendingIntent.getActivity(PendingIntent.java:305) android.app.PendingIntent.getActivity(PendingIntent.java:272) at com.xxxx.app.MainActivity.Notify( MainActivity.java:304) at com.xxxx.app.MyAlarmService.onStart(MyAlarmService.java:41) (android.app.Service.onStartCommand(Service.java:459) android.app.ActivityThread.handleServiceArgs ActivityThread.java:3010)android.os.Handler.dispatchMessageでandroid.app.ActivityThread $ H.handleMessage(ActivityThread.java:1442) でandroid.app.ActivityThread.-wrap17(ActivityThread.java) で (ハンドラ.java:102) android.os.Looper.loop(Looper.java:148) android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(ネイティブメソッド) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main (ZygoteInit。Javaの:616)あなたは以下の方法で同じことを行うことができます

+0

1)コピーはそれを呼び出す:

はここでの活動からサービスを開始するためのコードです。通知をトリガーするには、通知サービスにコンテキストまたはアクティビティーが必要です。 – Chaitu

+0

'Intent intent = new Intent(" com.xxxx.app.MainActivity ");'これはインテントを作成する方法の1つですが、エラーが発生しやすくなります。 –

+0

それに加えて、 'new MainActivity()。Notify(title、message);'は、Androidのライフサイクルによって管理されていないため、 'new MainActivity()'を実行してはならないので、 –

答えて

1

1)コピーサービスにする方法を通知し、通知をトリガするために必要な場所に呼び出し、通知サービスは、コンテキストのアクティビティやサービスのいずれかを必要とします)

2)あなたはSEではAIDL

1

トリガーに通知を使用して行うことができ

3)放送受信機を介してサービスからのアクティビティに通信することができます。 ryviceクラスをonStart()メソッド内に作成し、Intentを使用してMainActivityクラスからサービスを開始します。また、マニフェストであなたのサービスを宣言することを忘れないでください。あなたが必要な場所service.and方法を通知 Intent intent = new Intent(this, MyAlarmService.class); startService(intent);