2016-05-24 26 views
-2

ブロードキャストレシーバはWifiのSSIDを読み取り、それが目的のSSIDであればアクティビティを起動します。アクティビティが(ブロードキャスト受信者から)起動されると、何もしません。BroadcastReceiverから起動したときに動作がうまくいかないが、手動起動時に正常に動作する

BroadcastReceiver:

package com.example.mughal.tileviewtest.wifi; 

    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.net.wifi.WifiInfo; 
    import android.net.wifi.WifiManager; 
    import android.os.Bundle; 
    import android.widget.Toast; 

    import com.example.mughal.tileviewtest.LoadingActivity; 
    import com.example.mughal.tileviewtest.Main2Activity; 

    /** 
    * Created by Mughal on 4/28/2016. 
    */ 
    public class CheckWifi extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
      WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE); 
      WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 

      wifiInfo.getBSSID(); 

      Intent i=new Intent(context, LoadingActivity.class); 

      String temp=remove(wifiInfo.getSSID()); 


      String [] A=temp.split("_"); 
      if(A[0].equals("SPS")) 
      { 
       i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(i); 

      } 




     } 
     String remove(String a) 
     { 
      String b; 
      b= a.substring(1, a.length()-1); 
      return b; 

     } 


    } 

のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.mughal.tileviewtest"> 

     <uses-permission android:name="android.permission.INTERNET" /> 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

     <application 
      android:allowBackup="true" 
      android:icon="@mipmap/ic_launcher" 
      android:label="@string/app_name" 
      android:supportsRtl="true" 
      android:theme="@style/AppTheme"> 
      <activity 
       android:name=".MainActivity" 
       android:label="@string/app_name" 
       android:theme="@style/AppTheme.NoActionBar"></activity> 
      <receiver android:name="com.example.mughal.tileviewtest.wifi.CheckWifi" > 
           
       <intent-filter> 
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
           
       </intent-filter> 
      </receiver> 
      <activity android:name=".Main2Activity"> 
       </activity> 
      <activity 
       android:name=".LoadingActivity" 
       android:configChanges="orientation|keyboardHidden|screenSize" 
       android:label="@string/title_activity_loading" 
       android:theme="@style/FullscreenTheme"> 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
     </application> 

    </manifest> 

loadingActivity: パッケージcom.example.mughal.tileviewtest。

import android.annotation.SuppressLint; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.net.wifi.WifiInfo; 
    import android.net.wifi.WifiManager; 
    import android.os.AsyncTask; 
    import android.support.v7.app.ActionBar; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.text.format.Formatter; 
    import android.util.Log; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    import com.example.mughal.tileviewtest.databases.DBHelper; 
    import com.example.mughal.tileviewtest.networking.AsyncGetMap; 
    import com.example.mughal.tileviewtest.networking.TcpClient; 
    import com.example.mughal.tileviewtest.networking.TcpHandler; 
    import com.example.mughal.tileviewtest.objects.Floor; 
    import com.example.mughal.tileviewtest.objects.Map; 
    import com.example.mughal.tileviewtest.wifi.CheckWifi; 

    import java.util.ArrayList; 

    /** 
    * An example full-screen activity that shows and hides the system UI (i.e. 
    * status bar and navigation/system bar) with user interaction. 
    */ 
    public class LoadingActivity extends AppCompatActivity { 
     TcpClient mTcpClient; 
     String mapName; 
     String ip; 
     Context C; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_loading); 
      C=getApplicationContext(); 
      /* get connected wifi*/ 



      WifiManager wifiManager = (WifiManager) this.getSystemService(this.WIFI_SERVICE); 
      WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 


      String temp=wifiInfo.getSSID(); 
      temp=temp.substring(1,(temp.length()-1)); 
      String [] A=temp.split("_"); 
      if(A[0].equals("SPS")) 
      { 
      mapName=A[1]; 
      wifiInfo.getIpAddress(); 
      String tempIp = Formatter.formatIpAddress(wifiInfo.getIpAddress()); 
      String ipBreakDown[]=tempIp.split("\\."); 
      ip=(ipBreakDown[0]+"."+ipBreakDown[1]+"."+ipBreakDown[2]+"."+"69"); 
       new ConnectTask().execute(mapName); 
      }else{ 
       Toast.makeText(this,"NOT WITHIN SPS WIFI RANGE: ",Toast.LENGTH_LONG).show(); 
       this.finish(); 
      } 
      /* if SPS_ , then ok; match name after _ */ 
     } 


     private class ConnectTask extends AsyncTask<String,String,TcpClient> { 

      @Override 
      protected TcpClient doInBackground(String... params) { 
       //we create a TCPClient object and 

       mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() { 
        @Override 
        //here the messageReceived method is implemented 
        public void messageReceived(String message) 
        { 
         //this method calls the onProgressUpdate 
         publishProgress(message); 
         Log.i("Debug", "Input message: " + message); 
        } 
       },ip); 
       mTcpClient.run(params[0]); 
       return mTcpClient; 
      } 

      @Override 
      protected void onProgressUpdate(String... values) { 
       super.onProgressUpdate(values); 
       Log.i("onProgressUpdate", values[0]); 
       String path=values[0]; 
       mTcpClient.stopClient(); 
      /* check db for map with name */ 
       DBHelper dbh = new DBHelper(getApplicationContext()); 
       path=path.substring(0,path.length()-1); 
       ArrayList<Map> maps = dbh.getMap(mapName); 

      /* if present,get map from local db*/ 
       if(maps.isEmpty()) 
       { 

        new AsyncGetMap(getApplicationContext(),mapName,path,ip).execute(); 
       } 
       else 
       { 
        //get floors from db 
        ArrayList<Integer>floorNumbs = new ArrayList<Integer>(); 
        ArrayList <Integer> TileNumbs = new ArrayList<Integer>(); 

        String [] pathSpl=path.split("-"); 
        String [] pathSp2=pathSpl[0].split(","); 
        int psF=Integer.parseInt(pathSp2[0]); 
        int psT=Integer.parseInt(pathSp2[1]); 
        String [] fmark=pathSpl[1].split("@"); 

        for(int i=0;i<fmark.length;i++){ 
         String [] Tmark=fmark[i].split(":"); 
         String [] Tmark2=Tmark[1].split(","); 
         int HeyHey = Integer.parseInt(Tmark[0]); 
         for(int j=0;j<Tmark2.length;j++){ 
          floorNumbs.add(HeyHey); 
          TileNumbs.add(Integer.parseInt(Tmark2[j])); 
         } 
        } 


        int map_id = maps.get(0).getId(); 

        ArrayList<Floor> floors = dbh.getFloors(map_id); 

        //marking the parking spot 
        floors.get((psF-1)).markPS(psT); 


        for(int i=0;i<floorNumbs.size();i++){ 
         floors.get((floorNumbs.get(i)-1)).changeTileToMarked(TileNumbs.get(i)); 
        } 
        ArrayList <Integer> hey= new ArrayList <Integer>(); 

        for(int l=0;l<floors.size();l++){ 
         hey.add(floors.get(l).getRowSeparator()); 
        } 

       /* add floors as extra,start new activity */ 
        Intent i= new Intent(getApplicationContext(),MainActivity.class); 
        Bundle x = new Bundle(); 
        x.putIntegerArrayList("RowSeps",hey); 
        x.putInt("current",1); 
        x.putInt("Total",floors.size()); 
        for(int j=0;j<floors.size();j++) 
        { 
         int temp=j+1; 
         String K="floor"+Integer.toString(temp); 
         x.putIntegerArrayList(K, floors.get(j).getIntArraylist()); 

        } 

        i.putExtra("MeraBundle",x); 
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        getApplicationContext().startActivity(i); 
       } 

      } 
     } 


    } 
+0

「何もしない」とはどういう意味ですか? –

+0

この行は実行されません。 新しいConnectTask()。execute(mapName); 私のアプリが進歩するために不可欠です。これらの活動のポイントは、主な活動を開始するのが中間段階であることです。放送受信者から起動された場合にその活動を開始しません – saadwaqar

+0

詳細を提供するために質問を編集する必要があります。 'AsyncTask'が実行されていないことをどのように知っていますか?' TcpClient'は、それが既に非同期に実行されているように見えます。それはあなたがそれを 'AsyncTask'で持っていますか? –

答えて

-1

コンテキストは現在実行中のアクティビティを示します。 LoadingActivityはアクティビティであるため、その動作は渡されるコンテキストを持ち、そのコンテキストを参照します。 onReceive内のコンテキストがnullになるだけで、アクティビティを参照していないので、非アクティビティクラスのCheckWifiからアクティビティを開始しようとしています。あなたはBroadcastReceiverのドキュメントは、あなたが希望のAndroidで利用できるようにGoogleで検索を持っていた場合

はこの出くわし:

「startActivity()で使用される参照するにはBroadcastReceiverまたはキャプチャインテントのための方法はありません。同様に、ときにIntentをブロードキャストしても、あなたはアクティビティを見つけることはできません。

+0

渡されたコンテキストがnullの場合、なぜアクティビティが起動していますか?これは基本的に私がこのすべてについて冗談にするものです。 – saadwaqar

-1

私はあなたがCONNECTIVITY_CHANGE broadcastreceiverからアクティビティを起動することはできません。このブロードキャストはバックグラウンドで行われます。あなたができることは、受信者から通知を作成し、ユーザーが通知を選択したときにその活動を開始することです。

+0

しかし、アクティビティは起動しますが、先には機能しません。 – saadwaqar

関連する問題