简体   繁体   English

在意图服务和类之间未传递值

[英]Values not passed between Intent Service and Class

Explanation: I made this intent service in a new class (connectionchecker.java) which is used to check for internet connection. 说明:我在一个用于检查Internet连接的新类(connectionchecker.java)中提供了此Intent服务。 Now in my main class (First.java), the values are not recieved because the if() is never executed. 现在在我的主类(First.java)中,因为从未执行过if(),所以未接收到这些值。 My app doesn't crash , the problem is the TextView is stuck on "CONNECTION:" instead of saying "CONNECTION:You are not connected to the internet." 我的应用程序没有崩溃 ,问题在于TextView卡在了“连接:”上,而不是说“连接:您未连接到互联网。” or ""CONNECTION:You are not connected to the internet.". 或““连接:您尚未连接到互联网。”。

Code: First.java 程式码: First.java

 package com.lofty.lofti; import com.lofty.lofti.util.SystemUiHider; import android.annotation.TargetApi; import android.app.Activity; import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.inputmethodservice.Keyboard; import android.inputmethodservice.KeyboardView.OnKeyboardActionListener; import android.view.KeyEvent; import android.view.View.OnKeyListener; import android.inputmethodservice.KeyboardView; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import android.content.BroadcastReceiver; /** * An example full-screen activity that shows and hides the system UI (ie * status bar and navigation/system bar) with user interaction. * * @see SystemUiHider */ public class First extends Activity { /** * Whether or not the system UI should be auto-hidden after * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. */ private static final boolean AUTO_HIDE = true; /** * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after * user interaction before hiding the system UI. */ private static final int AUTO_HIDE_DELAY_MILLIS = 3000; /** * If set, will toggle the system UI visibility upon interaction. Otherwise, * will show the system UI visibility upon interaction. */ private static final boolean TOGGLE_ON_CLICK = true; /** * The flags to pass to {@link SystemUiHider#getInstance}. */ private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION; /** * The instance of the {@link SystemUiHider} for this activity. */ private SystemUiHider mSystemUiHider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().hide(); // HIDE ACTION BAR. setContentView(R.layout.activity_first); EditText enter = (EditText) findViewById(R.id.searchbox); enter.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { EditText searchbox = (EditText) findViewById(R.id.searchbox); String search = searchbox.getText().toString(); Intent open = new Intent(Intent.ACTION_WEB_SEARCH); open.putExtra(SearchManager.QUERY, search); startActivity(open); return true; } else { return false; } } }); } public class Connection extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Integer connectionn = intent.getIntExtra("connection",0); TextView connectiontext = (TextView) findViewById(R.id.connectiontext); if(connectionn==1) { connectiontext.setText("CONNECTION:You are not connected to the internet."); } if(connectionn==0) { connectiontext.setText("CONNECTION:You are not connected to the internet."); } } } public void exit(View view) { finish(); System.exit(0); } public void usernameclick (View view) { EditText searchbox = (EditText) findViewById(R.id.searchbox); String search = searchbox.getText().toString(); Intent open = new Intent(Intent.ACTION_WEB_SEARCH); open.putExtra(SearchManager.QUERY, search); startActivity(open); } } 

connectionchecker.java connectionchecker.java

 package com.lofty.lofti; import android.app.IntentService; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.widget.EditText; public class connectionchecker extends IntentService { public static final int connection =0; public connectionchecker() { super("connectionchecker"); } @Override protected void onHandleIntent(Intent intent) { ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED|| connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).getState()== NetworkInfo.State.CONNECTED) { Intent data = new Intent(this, First.class); data.putExtra("connection",1); sendBroadcast(data); } else { Intent data = new Intent(this, First.class); data.putExtra("connection", 0 ); sendBroadcast(data); } } } 

AndroidManifest.xml AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.lofty.lofti" > <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".First" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name" android:theme="@style/FullscreenTheme" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".connectionchecker"/> <receiver android:name=".First$Connection"/> </application> </manifest> 

Thank you and have a good day. 谢谢你,有一个美好的一天。

Logcat: Logcat:

 10-23 16:01:25.765 2175-2175/com.lofty.lofti E/Zygote﹕ MountEmulatedStorage() 10-23 16:01:25.765 2175-2175/com.lofty.lofti E/Zygote﹕ v2 10-23 16:01:25.775 2175-2175/com.lofty.lofti I/SELinux﹕ Function: selinux_compare_spd_ram, SPD-policy is existed. and_ver=SEPF_GT-I9505_5.0.1 ver=27 10-23 16:01:25.775 2175-2175/com.lofty.lofti I/SELinux﹕ Function: selinux_compare_spd_ram , priority [2] , priority version is VE=SEPF_GT-I9505_5.0.1-1_0032 10-23 16:01:25.775 2175-2175/com.lofty.lofti E/SELinux﹕ [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL 10-23 16:01:25.775 2175-2175/com.lofty.lofti I/art﹕ Late-enabling -Xcheck:jni 10-23 16:01:25.955 2175-2175/com.lofty.lofti D/ResourcesManager﹕ creating new AssetManager and set to /data/app/com.lofty.lofti-2/base.apk 10-23 16:01:26.185 2175-2175/com.lofty.lofti D/AndroidRuntime﹕ Shutting down VM 10-23 16:01:26.195 2175-2175/com.lofty.lofti E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.lofty.lofti, PID: 2175 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lofty.lofti/com.lofty.lofti.First}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) at android.app.ActivityThread.access$900(ActivityThread.java:177) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:309) at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:278) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:252) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) at com.lofty.lofti.First.onCreate(First.java:68) at android.app.Activity.performCreate(Activity.java:6289) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)            at android.app.ActivityThread.access$900(ActivityThread.java:177)            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)            at android.os.Handler.dispatchMessage(Handler.java:102)            at android.os.Looper.loop(Looper.java:145)            at android.app.ActivityThread.main(ActivityThread.java:5942)            at java.lang.reflect.Method.invoke(Native Method)            at java.lang.reflect.Method.invoke(Method.java:372)            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 10-23 16:06:26.538 2175-2175/? I/Process﹕ Sending signal. PID: 2175 SIG: 9 

I just update your code, by following the tuto from Lars http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html 我只是按照Lars http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html的教程更新您的代码

  1. You have to register the broadcast receiver before it can receive anything. 您必须先注册广播接收器,然后才能接收任何内容。 Have a look at this question. 看看这个问题。 https://stackoverflow.com/a/4806091/2733216 https://stackoverflow.com/a/4806091/2733216

     IntentFilter filter = new IntentFilter(Connection.ACTION_RESP); registerReceiver(mConnection, filter); 
  2. Your service wasn't started (at least in the code you provided) 您的服务尚未启动(至少在您提供的代码中)

    in your Activity 'onCreate' 在您的活动“ onCreate”中

     // Start your Service Intent msgIntent = new Intent(this, ConnectionChecker.class); startService(msgIntent); 
  3. You didn't instantiate your BroadCastReceiver 您没有实例化BroadCastReceiver

     // Instanciate your BCR mConnection = new Connection(); 
  4. Define a message : 定义一条消息:

     public static final String ACTION_RESP = "intent.action.MESSAGE_PROCESSED"; 
  5. Define the message to the Intent 定义消息到意图

     data.setAction(MainActivity.Connection.ACTION_RESP); 
  6. Use Default Intent Constructor for the one that are sent from the Service 从服务发送的默认Intent构造函数中使用

     Intent data = new Intent(); 

Then finally, the whole code : 最后,整个代码:

  1. Activity 活动

    public class MainActivity extends AppCompatActivity { 公共类MainActivity扩展了AppCompatActivity {

     private Connection mConnection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText enter = (EditText) findViewById(R.id.searchbox); enter.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { EditText searchbox = (EditText) findViewById(R.id.searchbox); String search = searchbox.getText().toString(); Intent open = new Intent(Intent.ACTION_WEB_SEARCH); open.putExtra(SearchManager.QUERY, search); startActivity(open); return true; } else { return false; } } }); // Start your Service Intent msgIntent = new Intent(this, ConnectionChecker.class); startService(msgIntent); // Instanciate BCR mConnection = new Connection(); // Register BCR IntentFilter filter = new IntentFilter(Connection.ACTION_RESP); registerReceiver(mConnection, filter); } public class Connection extends BroadcastReceiver { public static final String ACTION_RESP = "intent.action.MESSAGE_PROCESSED"; @Override public void onReceive(Context context, Intent intent) { Integer connectionn = intent.getIntExtra("connection", 0); TextView connectiontext = (TextView) findViewById(R.id.connectiontext); if (connectionn == 1) connectiontext.setText("CONNECTION:You are not connected to the internet."); else connectiontext.setText("CONNECTION:You are not connected to the internet."); } } public void exit(View view) { finish(); System.exit(0); } public void usernameclick(View view) { EditText searchbox = (EditText) findViewById(R.id.searchbox); String search = searchbox.getText().toString(); Intent open = new Intent(Intent.ACTION_WEB_SEARCH); open.putExtra(SearchManager.QUERY, search); startActivity(open); } 

    } }

  2. Service 服务

    public class ConnectionChecker extends IntentService { public static final int connection =0; 公共类ConnectionChecker扩展了IntentService {public static final int connection = 0;

     public ConnectionChecker() { super("connectionchecker"); } @Override protected void onHandleIntent(Intent intent) { ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED|| connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).getState()== NetworkInfo.State.CONNECTED) { Intent data = new Intent(); data.setAction(MainActivity.Connection.ACTION_RESP); data.putExtra("connection", 1); sendBroadcast(data); } else { Intent data = new Intent(); data.setAction(MainActivity.Connection.ACTION_RESP); data.putExtra("connection", 0 ); sendBroadcast(data); } } 

    } }

the values are not received because the if() is never executed 由于从未执行过if(),因此未接收到这些值

Pass an action for the Intent , instead of using like this: Intent传递一个动作,而不是像这样使用:

Intent data = new Intent(this, First.class);

But, you should: 但是,您应该:

Intent data = new Intent("ACTION_NAME");

And make sure that you registered that action to manifest: 并确保您注册了该操作以显示:

<receiver android:name=".First$Connection">
    <intent-filter>
        <action android:name="ACTION_NAME" />
    </intent-filter>
</receiver>

the problem is the TextView is stuck 问题是TextView卡住了

Make an instance variable for connectiontext : connectiontext一个实例变量:

public class First extends Activity {

    ...
    private TextView connectiontext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        getActionBar().hide(); // HIDE ACTION BAR.
        connectiontext = (TextView) findViewById(R.id.connectiontext);
        ...
    }
...
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM