2

解決できない奇妙な問題があります。自分で作成したサービスからListActivityを開こうとしています。ListActivityは、リストに表示する必要があるサービスから写真パスを受け取ります。これはサービスのコードです:

public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
    Toast to=Toast.makeText(this, "entrando en servicio", 1000);
    to.show();
    accederFotosFolder();
    crearArrayFotos();      
    Intent i=new Intent(this.getBaseContext(),Lista.class);
    Bundle b=new Bundle();
    b.putStringArrayList("imagenes",imagenes);
    i.putExtras(b);
    Toast t=Toast.makeText(this, ""+i, 1000);
    t.show();
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.setFlags(Intent.FLAG_FROM_BACKGROUND);
    startActivity(i);
}

これを実行すると、常にnullポインタ例外が発生します。

チェックしたところ、null、バンドル、画像(ArrayList<String>accederFotosFolder()+ criarArrayFotos()によって生成された2つの要素を持つ)は何もありません。どちらも意図ではありません。startActivity(i)にコメントすると、すべてが機能するので、その行は確かに機能します。私が最初に思ったのは、mi ListActivityに何か問題があると思ったのですが、コードに含まれることはなく、startActivity(i)行で停止するだけです。

助言がありますか?それは私を怒らせています。

アップデート

 **That's the logcat output**

11-21 19:02:32.214: E/AndroidRuntime(28980): FATAL EXCEPTION: main
11-21 19:02:32.214: E/AndroidRuntime(28980): java.lang.RuntimeException: Unable to      start service com.example.serviciofotos.Servicio@4166f550 with Intent { cmp=com.example.serviciofotos/.Servicio }: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2518)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.app.ActivityThread.access$1900(ActivityThread.java:134)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1310)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.os.Looper.loop(Looper.java:154)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.app.ActivityThread.main(ActivityThread.java:4624)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at java.lang.reflect.Method.invokeNative(Native Method)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at java.lang.reflect.Method.invoke(Method.java:511)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)    
11-21 19:02:32.214: E/AndroidRuntime(28980):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at dalvik.system.NativeStart.main(Native Method)
11-21 19:02:32.214: E/AndroidRuntime(28980): Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.app.ContextImpl.startActivity(ContextImpl.java:871)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.content.ContextWrapper.startActivity(ContextWrapper.java:276)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at com.example.serviciofotos.Servicio.onStart(Servicio.java:53)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.app.Service.onStartCommand(Service.java:438)
11-21 19:02:32.214: E/AndroidRuntime(28980):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2501)
11-21 19:02:32.214: E/AndroidRuntime(28980):    ... 10 more
4

3 に答える 3

4

現在のサービスコンテキストを使用するか、getApplicationContext()代わりに次のgetBaseContext()ようにサービスからListActivityを開始します。

Intent i=new Intent(Your_Service_Name.this,Lista.class);
Bundle b=new Bundle();
b.putStringArrayList("imagenes",imagenes);
i.putExtras(b);
Toast t=Toast.makeText(this, ""+i, 1000);
t.show();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setFlags(Intent.FLAG_FROM_BACKGROUND);

startActivity(i);
于 2012-11-21T17:31:22.783 に答える
2

解決!!!!!

ついに!!!わかりました、2つの間違いがありました。1つ目は、私の行i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 間違った場所にあります、それは意図の宣言の直後でなければなりません。

2番目の問題は、ArrayListをListActivityに送信し、文字列を受信しようとしていたことです(間違ったバンドルメソッド)。以上です。

助けを求めてくれたすべての人に感謝します。ここにサービスの正しいコードがあります:

  public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
    Toast to=Toast.makeText(this, "entrando en servicio", 1000);
    to.show();
    accederFotosFolder();
    crearArrayFotos();

    Intent i=new Intent(Servicio.this.getBaseContext(),Lista.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Bundle b=new Bundle();
    b.putStringArrayList("imagenes",imagenes);
    i.putExtras(b);
    getApplication().startActivity(i);
} 

そしてListActivity

   public class Lista extends ListActivity {
private Bundle recogerDatos=new Bundle();
private ArrayList<String> imagenes;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    recogerDatos=this.getIntent().getExtras();

    imagenes=recogerDatos.getStringArrayList("imagenes");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, imagenes);
    setListAdapter(adapter);
}
于 2012-11-26T10:20:27.300 に答える
0

これをで実行していますonStart()。つまり、コンテキストは。まで作成されないためthis.getBaseContext()に返されます。nullonCreate()

次のいずれかを使用します。

Intent i=new Intent(this.getApplicationContext(),Lista.class);

または、コードをに移動しますonCreate()

于 2012-11-21T17:32:24.220 に答える