在Mainactivity.class之外运行非静态方法startActivity(Intent)

时间:2014-03-22 14:49:47

标签: java android start-activity

我有一个Mainactivity类,它有一个notificationslistener(单独的类),当一个通知出现时它调用我的gethtml类。它们都扩展了活动,但我的gethtml类中的startactivity不起作用...(如果我复制并测试这个我的MainActivity中的代码工作正常)..任何想法为什么?

这是主要课程:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IntentFilter filter = new IntentFilter();
    filter.addAction("com.kpbird.nlsexample.NOTIFICATION_LISTENER_EXAMPLE");
    startService(new Intent(MainActivity.this, NLService.class));
    Intent intent=new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
    startActivity(intent);        

    }

@Override
protected void onDestroy() {
    super.onDestroy();

}
}

这是通知监听器

public class NLService extends NotificationListenerService {

@Override
public void onCreate() {
    super.onCreate();
    IntentFilter filter = new IntentFilter();
    filter.addAction("com.kpbird.nlsexample.NOTIFICATION_LISTENER_SERVICE_EXAMPLE");
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public void onNotificationPosted(StatusBarNotification sbn) {   
    new Thread(new Runnable() {             
            public void run(){
            Looper.prepare();
            int cangethtml = 1;
                try{
                    if(cangethtml==1){
                        cangethtml = 0; //only runs once
                        new html();
                    }
                }finally{Looper.loop();}  
            }; 
        }).start();    
    }

@Override
public void onNotificationRemoved(StatusBarNotification sbn) {}
}

这是最后一个不通过startactivity打开网站的课程。

public class html extends Activity{
public html()  {
    Intent i2 = new Intent("android.intent.action.MAIN");
            i2.setComponent(ComponentName.unflattenFromString("com.android.chrome/com.android.chrome.Main"));
            i2.addCategory("android.intent.category.LAUNCHER");
            i2.setData(Uri.parse("https://wwww.google.com"));
            System.out.println("hello1");
            startActivity(i2);
            System.out.println("hello2");
}
}

1 个答案:

答案 0 :(得分:0)

你正试图在html的构造函数上启动一个活动,这就是你的问题。 你可以做的是将服务上下文传递给html类。

试试这个:

public html(Context externalContext)  {
        Intent i2 = new Intent("android.intent.action.MAIN");
        i2.setComponent(ComponentName.unflattenFromString("com.android.chrome/com.android.chrome.Main"));
        i2.addCategory("android.intent.category.LAUNCHER");
        i2.setData(Uri.parse("https://wwww.google.com"));
        i2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        System.out.println("hello1");
        externalContext.startActivity(i2); --> START WITH EXTERNAL CONTEXT!!!
        System.out.println("hello2");

}

并且......注入通知服务上下文:

@Override
public void onNotificationPosted(StatusBarNotification sbn) {   
    new Thread(new Runnable() {             
            public void run(){
            Looper.prepare();
            int cangethtml = 1;
                try{
                    if(cangethtml==1){
                        cangethtml = 0; //only runs once
                        new html(NLService.this); --> !!!! inject CONTEXT !!!!
                    }
                }finally{Looper.loop();}  
            }; 
        }).start();    
    }

实际上......你的html根本不需要扩展Activity(实际上对我而言html()应该是你的通知服务而不是类的方法。)